隨筆加強記憶,備查
每隔一段時間都被這破函式坑幾十分鐘的排錯時間😂心累
把握好機制才能更好的寫出更具效能的程式碼,
舉例說明:
有以下基本程式碼
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才是更好的選擇