UE4/UE5筆記-關於CreateDefaultSubobject的機制於使用場景的思考

林清發表於2024-07-04

隨筆加強記憶,備查

每隔一段時間都被這破函式坑幾十分鐘的排錯時間😂心累

把握好機制才能更好的寫出更具效能的程式碼,

舉例說明:

有以下基本程式碼

class UMyObject : public UObject
{
 GENERATED_BODY()
public:
    UPROPERTY(EditAnywhere)
    TArray<int32> arr;
}
UCLASS(BlueprintType)
class AMyActor : public AActor
{
    GENERATED_BODY()
public:
    AMyActor ()
    {
        UMyObject = CreateSubObject<UMyObject >(TEXT("MyObj"));
        arr.Add(1);
        arr.Add(2);
        arr.Add(3);
     }
protected:
   UMyObject  Obj;
}        

當在Editor中所有第一次新拖拽出來到Level場景裡面的MyActor例項的Obj都會是arr=[1,2,3]

儲存場景後,如果這時候再修改程式碼成

        arr.Add(4);
        arr.Add(5);
        arr.Add(6);

原來已經拖拽到場景的MyActor物件其obj沒有主動改動arr會變成[1,2,3,4,5,6]或者是你在場景修改儲存後的值+[4,5,6](取決於你是否修改),再次拖拽新的MyActor到場景中去,會從Editor的detail發現Obj已經變成了arr=[4,5,6]

最後修改Obj為UPROPERTY(EditDefaultOnly),然後開啟藍圖類編輯器賦予arr=[6,7,8]

UPROPERTY(EditDefaultOnly)
UMyObject Obj;

會發現所有myActor的Obj=arr的預設陣列都變成了6,7,8


結論:
CreatedefaultSubObject更多是為了用於結合Editor進行便捷的修改編輯時使用的初始化例項方式並可由Editor進行序列化儲存(配合各種UPROPERTY的宏)
當沒有使用Editor對物件進行編輯修改的預期,請不要輕易使用CreateDefaultSubObject來建立物件
會有可能導致在你修改程式碼時,令你得物件例項的陣列容器之類的Value發生不符合你預期的變更.
如果希望程式碼全控制完全可以使用OnConstruction中使用NewObject才是更好的選擇

相關文章