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才是更好的选择
蓝图类的数组的改变,即使是默认无改动的实例也会意想不到的影响已经拖拽到场景的实例.
本文原创,不定时更新
可以随意转载到任何网站
~但是~ 转载也要按“基本法”
请注明原文出处和作者
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步