今天講了虛幻4的反射機制。
例子:
uclass()
class testcpp_api atestcppgamemode : public agamemode
;
generated_body()
部分,做了一大堆一大堆事情。定義在這個檔案中:
先看他的定義:
#define body_macro_combine_inner(a,b,c,d) a##b##c##d
#define body_macro_combine(a,b,c,d) body_macro_combine_inner(a,b,c,d)
#define generated_body_legacy(...) body_macro_combine(current_file_id,_,__line__,_generated_body_legacy)
#define generated_body(...) body_macro_combine(current_file_id,_,__line__,_generated_body)
把 fileid line _ _generated_body連起來。
我這裡最後的結果應該是
testcpp_source_testcpp_testcppgamemode_h_14_generated_body
可以看看自動生成的這個檔案
#include "testcppgamemode.generated.h"
裡面定義了這個巨集的具體內容,做了一大堆事情。
#define testcpp_source_testcpp_testcppgamemode_h_14_generated_body \
pragma_disable_deprecation_warnings \
public: \
testcpp_source_testcpp_testcppgamemode_h_14_inclass_no_pure_decls \
testcpp_source_testcpp_testcppgamemode_h_14_enhanced_constructors \
private: \
pragma_enable_deprecation_warnings
因為主要講的是反射,所以主要講了uclass的事情。可以看到第二個巨集定義的內容有乙個友元函式,是返回乙個uclass的例項,這個例項就包含了對於atestcppgamemode 類的屬性和函式的資訊。
#define testcpp_source_testcpp_testcppgamemode_h_14_inclass_no_pure_decls \
private: \
static void staticregisternativesatestcppgamemode(); \
friend testcpp_api class uclass* z_construct_uclass_atestcppgamemode(); \
public: \
declare_class(atestcppgamemode, agamemode, compiled_in_flags(0 | class_transient | class_config), 0, text("/script/testcpp"), no_api) \
declare_serializer(atestcppgamemode) \
/** indicates whether the class is compiled into the engine */ \
enum ;
編譯**,在
\intermediate\build\win64\ue4editor\inc\testcpp\
資料夾下會有乙個和工程名字相同的cpp,裡面有這個友元函式的實現。這裡還要說一下,所有你定義了沒有實現的函式,(加了implementation字尾的),都在這裡實現的。而有字尾的函式的定義在#include "testcppgamemode.generated.h"中。
uclass* z_construct_uclass_atestcppgamemode()
}check(outerclass->getclass());
return outerclass;
}
所以理順了就是每乙個我們寫的uclass,都在generated_body()巨集裡面定義了乙個友元函式返回這個類對應的uclass,這個uclass記錄了這個類的所有變數啊函式的資訊,就能例項化這個類的例項了。
對了,只有使用了虛幻的uproperty(),ufunction()等巨集的變數和函式才能被uclass記錄下來。cpp裡面的反射大概就是這樣。
藍圖的儲存就是乙個uclass,這個還沒機會研究。
虛幻4 碰撞過濾
英文原文 選擇什麼樣的碰撞顯然是非常重要的,但它可能會非常棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統可以一眼看上去有點複雜,但它是非常強大和一致的,所以我想給一點背景知識關於如何完成它。我們會談論碰撞的不同反應,我們如何使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不...
虛幻4 碰撞過濾
選擇什麼樣的碰撞顯然是很重要的。但它可能會很棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統能夠一眼看上去有點複雜,但它是很強大和一致的,所以我想給一點背景知識關於怎樣完畢它。我們會談論碰撞的不同反應,我們怎樣使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不同。首先你要知道...
虛幻4 碰撞過濾
選擇什麼樣的碰撞顯然是很重要的。但它可能會很棘手,而且我們在開發虛幻4的過程中已經花了相當長的時間討論。我們的系統能夠一眼看上去有點複雜,但它是很強大和一致的,所以我想給一點背景知識關於怎樣完畢它。我們會談論碰撞的不同反應,我們怎樣使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不同。首先你要知道...