Ara you OK?
我看你是思想出现了偏差
哇!你认出了错别单词!恭喜你获得一次向我支付宝充值助我重返欧洲的机会!
这个页面管关不掉了,你自己看着办吧

UE4/UE5笔记-关于CreateDefaultSubobject的机制与使用场景的思考

UE随笔加强记忆,备查

每隔一段时间都被这破函数坑几十分钟的排错时间😂心累

简单举例说明:

有以下基本代码

复制代码
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来创建对象(例如C++CreateDefaultSubObject引用资源的发生删除时,可能导致打开时Level导致无法定位)
会有可能导致在你修改代码时,令你得对象实例的数组容器之类的Value发生不符合你预期的变更.
如果希望代码全控制完全可以使用OnConstruction中使用NewObject才是更好的选择
蓝图类的数组的改变,即使是默认无改动的实例也会意想不到的影响已经拖拽到场景的实例.

 

posted @   林清  阅读(358)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示