前言
本文章仅作为个人学习笔记,本章中包含错误、过时、遗漏知识点等问题,因此请读者发现上述问题请谅解并且欢迎指正。本文更新时间:2020-8-6
引用
虚幻4官方中文文档:
TSoftClassPtr:
https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/TSoftClassPtr/index.html
TSoftObjectPtr
https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/TSoftObjectPtr/index.html
异步资源加载
https://docs.unrealengine.com/zh-CN/Programming/Assets/AsyncLoading/index.html
个人解读
原理
软指针中存放两个重要变量,其一为指针类型,其二为String(存放路径用)。在生成实例化之前,UE4引擎会在后台自动生成一个默认模板的对象并且不可修改。当使用软指针时,会先寻找内存中的指针对象,如果没有则根据路径去硬盘中寻找。因此多半情况是在对象未正式实例化时,提前引用其模板对象。本文章主要通过以下代码,获得软指针,并允许其在笔者创建的组件上,方便赋值。
UPROPERTY(EditAnywhere)
TSoftClassPtr<UUserWidget> ResourcesWidgetClassPtr;
UPROPERTY(EditAnywhere)
TMap<TSubclassOf<ABaseResources>, int> CharacterResourcesNumber;
目的
FSoftObjectPaths和TSoftObjectPtr
让美术或设计师引用资源的最简单方法是创建硬指针的UProperty并为它指定一个类别。在UE4中,如果有一个硬UObject指针属性引用了一个资源,则加载包含这个属性的对象(放在贴图中,或者从gameinfo等引用)时,就会加载这个资源。如果处理不当,就会在游戏开始时加载全部资源。如果您希望美术/设计师能够使用同一个UI作为硬指针来引用特定资源,而不必总是加载被引用资源,可以使用FSoftObjectPath
或TSoftObjectPtr
。
FSoftObjectPath是一个简单的结构体,其中有一个字符串包含资源的完整名称。如果您在类中添加这个类型的属性,它就会像
UObject *属性一样显示在编辑器中。它还会正确处理烘焙和重定向,因此如果您使用SoftObjectPath,就一定能在设备上正确工作。TSoftObjectPtr基本上是包含了
FSoftObjectPath的
TWeakObjectPtr,将用于设置特定类的模板,这样就可以限制编辑器UI仅允许选择特定类。如果被引用资源存在于内存中,则TSoftObjectPtr.Get()将返回这个资源。如果不存在,可以调用
ToSoftObjectPath()来找出它引用的资源,使用下述方法加载这个资源,然后再次调用TSoftObjectPtr.Get()
来取消引用。
如果美术或设计师要手动设置引用,则TSoftObjectPtrs
和Soft Object Paths十分有用,但如果想要通过查询等功能来查找符合特定要求的资源,而不加载所有资源,则可以使用资源注册表和对象库。
案例
//注:TSubclassof<T>作用原理与TSoftClassPtr<T>近似