✔ 使用这些指针类型:
- TSoftObjectPtr:用于引用可能已加载或未加载的对象。即使对象在其他未加载的关卡中,也可以指向该对象。当指向需要即时加载的资产(如网格)时,可以与异步加载函数一起使用。与蓝图中的“Soft Object Reference”变量类型相同。
- TSoftClassPtr:用于引用可能已加载或未加载的类或蓝图类型。一旦加载,它将提供一个类类型,可以从中创建实例。可与异步加载函数一起使用进行加载。与蓝图中的“Soft Class Reference”变量类型相同。
- TWeakObjectPtr:用于引用已实例化的对象。如果对象被销毁或垃圾回收,将解析为null。
❌ 不要使用这些指针类型:
- FSoftObjectPath:被其他指针类型内部使用。由于不缓存结果,速度较慢。在编辑器中设置时,它将指向UBlueprint类而不是UBlueprintGeneratedClass,这通常不适用于游戏代码。但是,编辑器插件的制作者可能需要该功能。
- FSoftClassPath:与FSoftObjectPath类似,但带有一些与加载类相关的辅助函数。现在主要是一种遗留类型。
- FSoftObjectPtr:非模板化且不在蓝图中公开的TSoftObjectPtr版本。
软指针和弱指针:
- 软指针(Soft Pointer)是一个对象的路径字符串表示,它可以是已加载或未加载的对象。它在内部存储一个弱指针(Weak Pointer),用于在查询并找到对象后进行缓存。
- 弱指针(Weak Pointer)仅引用已实例化的对象,不像软指针那样存储路径名称。
软指针(Soft Pointers):
- TSoftObjectPtr和TSoftClassPtr是应该使用的主要软指针类型。
- FSoftObjectPath是所有软指针类型的内部使用类型,不适合用于游戏代码。
- FSoftClassPath是FSoftObjectPath的类似版本,主要用于加载类,但现在已过时。
- FSoftObjectPtr是TSoftObjectPtr的基类,不建议直接使用。
弱指针(Weak Pointers):
- 弱指针不像软指针那样存储路径名称,它们仅引用已实例化的对象。
- 弱指针通过对象索引和对象序列号来引用对象。当调用Get()方法时,它会首先根据对象索引从GUObjectArray获取对象,然后使用对象序列号进行验证。
- 弱指针在验证对象的有效性时使用IsValid()方法,如果对象无效,则返回null。
总结:
软指针和弱指针是指向UObject的有效且安全的方式。弱指针不需要作为UPROPERTY存储,并且在解引用时具有一些开销。弱指针还可用于订阅委托,而无需担心在销毁时取消订阅。建议使用TSoftObjectPtr和TWeakObjectPtr作为首选指针类型。