編寫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
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實現。