虛幻4 反射

2021-07-11 00:52:14 字數 2456 閱讀 2388

今天講了虛幻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的過程中已經花了相當長的時間討論。我們的系統能夠一眼看上去有點複雜,但它是很強大和一致的,所以我想給一點背景知識關於怎樣完畢它。我們會談論碰撞的不同反應,我們怎樣使用通道來過濾碰撞,和勾勒出簡單和複雜碰撞體之間的不同。首先你要知道...