虛幻4——藍圖在腳本之間的交互

       從虛幻3到虛幻4.之前都已經習慣了在腳本中寫節點,然後在編輯器中供關卡師使用。所以對於這種開發模式,也不會有什麼不適應的感覺!可視化編輯,也是以後遊戲開發的重要的一環吧!但是國內遊戲開發還沒有這一種概念!對於關卡師,尤其懂遊戲邏輯的。這是多麼稀有的古董啊!現在的Blueprint比Kismet更強大了。可以自定義函數,宏等高級語言的特徵。現在的UE4的Blueprint就是UE3的UnrealScript腳本。

   對於虛幻的開發模式 = 腳本語言 + 可視化編輯 。知道怎樣把自己寫的代碼,不管是類封裝成可視化節點,還是調用這個類的函數的功能封裝成節點,然後在Blueprint中調用。



1.讓自己的類可以變成可以調用的Blueprint可視化節點編輯。就是Blueprint類


UCLASS(Blueprintable)
class AMyBlueprintableClass : AActor
{
    GENERATED_UCLASS_BODY()
}

這個創建Blueprint類的原理,有點UE3的原型的創建。不過前者前者和後者的實現功能不是在一個數量級上。

在UCLASS 宏的後面跟上類所需的標識即可,這個功能是告訴虛幻引擎,我創建的這個類是可以被用於創建Blueprint類的哦。


在類中使用與Blueprint有關的類標識有一下幾個:



Blueprintable:  這個類是可以創建Blueprint類,默認是NotBlueprintable。這個標識是可以繼承的。如果父類聲明瞭  Blueprintable 那麼繼承這個類的子類也能夠創建Blueprint。

BlueprintType : 這個標識是告訴虛幻引擎,我創建的這個類是可以當做類型的。如虛幻引擎的內置數據類型 uint32 一樣。如果我創建一個新的類,名爲 APickupActor  爲了在遊戲開始的時候用,我們想要知道當前的關卡中有好多APickupActor  的對象。我們可以在Blueprint中創建一個APickupActor  類型的數組,遍歷關卡中所有的APickupActor  實例。然後添加到這個數組中,方便我們在需要的時候進行索引。我們就可以在這個類的UCLASS中加上這個標識符。


NotBlueprintable:  這個標識符是告訴虛幻引擎,我們的這個類不能夠被Blueprint使用。當然默認選擇的是這個,就像傳統的c++類一樣來對待。

如果父類使用的Blueprintable 但是我們在子類中不想讓它可以當藍圖使用,我們可以在子類中聲明這個標識符來覆蓋父類的生命。


以上這些就是類和Blueprint有關的關鍵字。 這些聲明方式和UC腳本類的聲明方式是一樣的。原理一樣,只是書寫方式樣。



把類和Blueprint的關係弄清楚後,我們有時候需要在編輯器Blueprint頁面中修改和讀寫變量。所以知道怎樣讓自己類中定義的變量可以被Blueprint讀取或者修改也是非常重要的。

我們知道在UDK/UE3中爲了讓自己的變量可以進行編輯,通常都是在UC腳本中 寫下如下格式的變量

var(Weapon) ActWeapon   CurrentWeapon;  標識這個變量可以編輯




在UE4中定義我們可以在虛幻引擎中操作的變量時,必須要使用UPROPERTY(),這個告訴虛幻引擎對變量對進行相應的處理。怎麼處理呢?

很簡單,只需要在UPROPERTY宏中填入需要虛幻引擎處理的關鍵字就行了。如果沒有這個,就和其它普普通通的變量一樣了。當讓如果你在編輯器中不對這個變量進行操作,那個這個變量還是和普通的變量一樣,除了特殊的關鍵字。


BlueprintReadOnly:  藍圖只能讀取值,不能修改。

BlueprintReadWrite : 藍圖可以進行讀寫。


以上關鍵字在同一變量中只能使用其中的一個不能同時。

一下關鍵字是可以很上面的關鍵字組合使用,這個和Windows中窗口樣式的組合一樣。

BlueprintAssignable : 在藍圖中暴露該節點

BlueprintCallable:  該節點在藍圖中是可以被調用的。


除了類和類中定義的變量可以和Blueprint進行通信以外,我們的變量也在藍圖中調用。

只需要在定義的函數的上面使用宏UFUNTION 填入相應的關鍵字。這是告訴虛幻引擎進行相應的處理,比如我們在類中定義了一個可以獲取當前玩家的血量比。當時有的時候,根據需要我想在藍圖中調用,如果通過藍圖重新寫一個通過藍圖節點組成的獲取玩家血量的百分比的功能。這也能太費勁了吧。

把獲取血量百分比這個函數聲明爲藍圖可以調用的節點就行了。


關鍵字的意思:


BlueprintCallable :  藍圖可以調用,這個可以使改變調用的對象

BlueprintPure:  不能改變當前調用的對象,只負責,類似於輸入和輸入這種功能,比如數學的+ - * /叫做或者獲取值這些調用。

BlueprintImplementableEvent: 告訴虛幻引擎這個是虛函數,通過Blueprint來實現的。

如果沒有實現,函數調用將被忽略。重要的是要注意,如果BlueprintImplementableEvent沒有返回值或參數,它將顯示爲一個事件,可以通過右擊並選擇它的事件圖的藍圖。



BlueprintNativeEvent:  如果我們定義的這個函數的關鍵字是BlueprintImplementableEvent。這表明這個函數通過Blueprint來實現其功能。爲了防止我們在Blueprint中沒有對這個函數進行實現。所以我們在類中可以實現一個版本來應對在Blueprint沒有實現。

本地版本的函數實現,必須在函數名的後面加入_Implememt.。如我在代碼中聲明一個函數爲 void SetTarget();  現在我把這個函數的關鍵字申明爲 BlueprintImplementableEvent。這個是告訴引擎,這個函數是在Blueprint中實現的。如果我們在Blueprint類中沒有實現這個函數。我們可以在類中寫一個應對版本,格式如下,

void  XXX::SetTarget__Implememt()

{

  XXXXXXXXXXXX;

}


這個開銷是非常昂貴的,用在我們需要用的地方。

















 














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章