客製化DisplayAll輸出Struct的內容

 

在使用DisplayAll來顯示物件資訊的時候,有些struct結構比較龐大或是複雜(例如帶有指標指向其他物件)的時候,會顯示過多的資訊,讓整個螢幕變得很亂,反而不利於除錯。這時候我們會想要控制struct輸出的結果,去除不想看到的欄位。


為了達到這件事,我們尋找了一下怎麼控制輸出的結果,後來找到這篇的方法,可以透過UE4對struct做的Type Traits來幫助我們做到這件事。


Type Traits如果不知道是什麼的話沒有關係,下面的範例直接抄就好了。

不過打在這邊就單純是讓想多了解一點的人,有關鍵字可以做更進一步的了解背後運作的原理。


修改輸出結果的具體範例以及程式碼可以在Class.cpp以及Class.h裡面看到。

檔案路徑在

Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp


Class.cpp裡面有個FTestStruct

struct ENGINE_API FTestStruct


這次的需求,需要關注的項目是

WithExportTextItem 以及Struct對應的函式ExportTextItem


你必須先定義TStructOpsTypeTraits<FTestStruct>,並把將WithExportTextItem設為true

template<>
struct TStructOpsTypeTraits<FTestStruct> : public TStructOpsTypeTraitsBase2<FTestStruct>
{
	enum 
	{
		WithExportTextItem = true,
	};
};


然後在FTestStruct裡面實作ExportTextItem。

bool ExportTextItem(FString& ValueStr, FTestStruct const& DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope) const
{
	ValueStr += TEXT("(");
	for (TMap<int32, double>::TConstIterator It(Doubles); It; ++It)
	{
		ValueStr += FString::Printf( TEXT("(%d,%f)"),It.Key(), It.Value());
	}
	ValueStr += TEXT(")");
	return true;
}

需要注意的是第二個參數要根據struct給正確的名稱,以這個範例來說是FTestStruct const&
如果你是使用自己的struct,要在這邊換成對應的[YourStruct] const&


我們也有注意到如果有逗號的話,會造成換行,這點算是在輸出的時候要注意的地方。

以上簡單的修改就可以寫入你客製化的內容在DisplayAll。

留言

這個網誌中的熱門文章

UE4 除錯技巧分享 (一)

UE4 GameplayAbilityTask介紹

UE4 Navigation Mesh 心得