[程式] UE4 客製化DisplayAll輸出Struct的內容

作者: yekdniw (yekdniw)   2021-03-02 23:23:07
網頁版
https://yekdniwue.blogspot.com/2021/02/CustomExportTextItem.html
在使用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。
作者: metallican (鋼鐵人)   2021-03-03 01:05:00
專業推 感謝分享
作者: oopFoo (3d)   2021-03-03 17:52:00
Y大,有沒有考慮開課啊
作者: coolrobin (泳圈)   2021-03-04 00:31:00
感謝推
作者: yekdniw (yekdniw)   2021-03-05 10:10:00
開課應該是沒有 其實文章觀看數比想像中少~

Links booklink

Contact Us: admin [ a t ] ucptt.com