0:編寫虛幻引擎中的UC和C++代碼

  編寫native code,在利用VS開始編譯C++代碼以前,利用Frontend進行腳本編譯,有的腳本會自動生成一些native 類,除非我使用了noexport。網絡

  另外注意的地方是UE本身定義了一些宏,我將會總結這些宏的通常使用規律。編輯器

  以《無盡之劍》的代碼進行研究。經過此次研究使我掌握:函數

 

  1.建立本身的native code測試

  關注這些宏定義。爲了讓uc和C++能有交互,Epic定義了許多宏來解決問題。spa

  先從《無盡之劍》的native code看起。code

  咱們看到native代碼並很少,咱們的大多數工做內容都是使用unrealscript來實現邏輯的,方便快捷。只有在解決網絡底層的時候咱們再使用native code。blog

  《無盡之劍》很好的使用包分類了本身的工程,包括UI,AnimNotifies,Inventory,kismet和Multiplayer,online 以及UI規劃本身的uc腳本。繼承

  對於使用了native的uc,咱們能夠作一個測試進行編譯。ip

    

    第一個測試,建立本身的生成native腳本。我建立了一個ArtAnimNotify代碼以下:io

 在ArtAnimNotify.uc中:
class ArtAnimNotify extends AnimNotify native(Anim);


var bool bTestBool;    //第一個測試變量    

var() int bTestInt;    //第二個測試變量


function int MyUCFunc(int a)
{
    local int b;

    b=3;
    return a+b;
}



//native函數的定義區域
cpptext
{
    virtual void testFunc1();

    virtual FString testFunc2(int num);

    int MyNativeFunc();
}

 簡單說明:這段UC代碼繼承自AnimNotify,定義了本身的native代碼名字Anim。

  有一個Bool變量和一個int變量。開闢了一個C++代碼區域,裏面有兩個函數。

  對上述代碼我在Frontend中進行腳本編譯,而後在Inc頭文件目錄虛幻引擎本身生成了一個名爲ArtGameAnimClasses.h的頭文件,由於這是系統生成的,我拋去了自動生成的連接內容,這是幫助虛幻引擎和這些內容進行關聯的:

 在ArtGameAnimClasses.h中:
class UArtAnimNotify : public UAnimNotify
{
public:
    //## BEGIN PROPS ArtAnimNotify
    BITFIELD bTestBool:1;
    INT bTestInt;
    //## END PROPS ArtAnimNotify

    DECLARE_CLASS(UArtAnimNotify,UAnimNotify,0,ArtGame)
    virtual void testFunc1();

    virtual FString testFunc2(int num);

    int MyNativeFunc();
};

 

  我截取了一部分系統生成的核心代碼,關聯代碼能夠無論,系統會自動爲咱們生成。

  對照着咱們的UC代碼咱們能夠看到變量部分:

    var bool bTestBool;      ---->    BITFIELD bTestBool:1; 

  var() int bTestInt;       ----->    INT bTestInt;         //注意C++無視咱們能夠在編輯器中能夠編輯的()符號 

 

  而對於函數部分:

  virtual void testFunc1();-------> virtual void testFunc1();

  virtual FString testFunc2(int num)------> virtual FString testFunc2(int num);    

  int MyNativeFunc();                   ---------> int MyNativeFunc();

  能夠看到,我寫了什麼就會輸出什麼,而這個cpptext就像一個類聲明塊。對於我沒有在這個塊中放的函數

  function int MyUCFunc(int a);

  你會發現頭文件就不在具備了,系統會把這個當作一個單純的UC函數來處理。

 

  再者,我看到了頭文件中有一個宏

  DECLARE_CLASS(UArtAnimNotify,UAnimNotify,0,ArtGame);

  這個宏的參數有當前的C++類,以及他的繼承類UAnimNotify(從UC中和該頭文件中能夠看到繼承關係)以及當前的工程名ArtGame。

 

  2.多重頭文件

  我在《無盡之劍》中看到了有多個uc腳本都native(Anim)這個頭文件,我很好奇這會是怎樣的狀況。所以我將進行這個步驟測試。

  我定義了一個class ArtAnimNotify extends AnimNotify native(Anim);在這裏沒有定義cpptext區段

class ArtAnimNotify_FX extends AnimNotify native(Anim);
/*
cpptext
{
}
*/

 

  由於咱們在native(Anim),這個uc類會自動在頭文件ArtGameAnimClasses.h中進行聲明。   

  因爲咱們沒有cpptext區段,系統會自動的加上沒有定義構造函數。

class UArtAnimNotify_FX : public UAnimNotify
{
public:
    //## BEGIN PROPS ArtAnimNotify_FX
    //## END PROPS ArtAnimNotify_FX

    DECLARE_CLASS(UArtAnimNotify_FX,UAnimNotify,0,ArtGame)
    NO_DEFAULT_CONSTRUCTOR(UArtAnimNotify_FX)
};

 

  3.不標註Native(文件名)

  咱們在UC腳本中能夠定義本身native和cpptext,編譯事後系統爲咱們生成對應uc腳本的頭文件。放在哪一個文件中取決於native(文件名)
  固然還有一種狀況,你也能夠不定義本身的文件名

  class ArtAnimNotify_FX extends AnimNotify native;

  這樣的狀況,頭文件將會定義在ArtGameClasses.h中,也就是你的工程頭文件中。

 

  在下一節我將會進行基本的Native.cpp實現。

相關文章
相關標籤/搜索