[UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()

本文介绍Unreal Engine 4 (UE4)中如何使用LoadObject和LoadClass函数动态加载UObject实例和UClass类型。文章详细解释了这两者的用法,并给出具体示例,特别强调了蓝图加载时的注意事项。

原文作者:@玄冬Wong 

 

相关内容:
C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder() 

http://aigo.iteye.com/blog/2281373

C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例

http://aigo.iteye.com/blog/2268056

 

动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T>() ,两者均在在UObjectGlobals.h中。

 

另外注意:LoadClass<T>的模版名称,不能直接写UBlueprint,例如:LoadClass<UBlueprint>是错误的,创建蓝图时选择的是什么父类,则写对应的父类名,假如是Actor,那么要写成:LoadClass<AActor>,否则无法加载成功。

路径名也必须带_C后缀(LoadObject不需要带_C后缀),例如,蓝图路径是:Blueprint'/Game/Blueprints/MyBP.MyBP'

加后缀以后,则是:Blueprint'/Game/Blueprints/MyBP.MyBP_C',

例子:

 

Cpp代码   收藏代码
  1. UClass* Test = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/Blueprints/MapPathBrush_BP.MapPathBrush_BP_C'"));  
 

 

官方还没出文档,只能先看代码注释:

Cpp代码   收藏代码
  1. // Load an object.  
  2. templateclass T >   
  3. inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )  
  4. {  
  5.     return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );  
  6. }  

 

Cpp代码   收藏代码
  1. // Load a class object.  
  2. templateclass T >   
  3. inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )  
  4. {  
  5.     return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );  
  6. }  

 

Cpp代码   收藏代码
  1. /** 
  2.  * Find or load an object by string name with optional outer and filename specifications. 
  3.  * These are optional because the InName can contain all of the necessary information. 
  4.  * 
  5.  * @param ObjectClass   The class (or a superclass) of the object to be loaded. 
  6.  * @param InOuter       An optional object to narrow where to find/load the object from 
  7.  * @param InName        String name of the object. If it's not fully qualified, InOuter and/or Filename will be needed 
  8.  * @param Filename      An optional file to load from (or find in the file's package object) 
  9.  * @param LoadFlags     Flags controlling how to handle loading from disk 
  10.  * @param Sandbox       A list of packages to restrict the search for the object 
  11.  * @param bAllowObjectReconciliation    Whether to allow the object to be found via FindObject in the case of seek free loading 
  12.  * 
  13.  * @return The object that was loaded or found. NULL for a failure. 
  14.  */  
  15. COREUOBJECT_API UObject* StaticLoadObject( UClass* Class, UObject* InOuter, const TCHAR* Name, const TCHAR* Filename = NULL, uint32 LoadFlags = LOAD_None, UPackageMap* Sandbox = NULL, bool bAllowObjectReconciliation = true );  
  16. COREUOBJECT_API UClass* StaticLoadClass(UClass* BaseClass, UObject* InOuter, const TCHAR* Name, const TCHAR* Filename = NULL, uint32 LoadFlags = LOAD_None, UPackageMap* Sandbox = NULL);  

 

 

 LoadObject加载例子,不需要添加后缀:

Cpp代码   收藏代码
  1. UTexture2D* Tex = LoadObject<UTexture2D>(NULL, TEXT("Texture2D'/Game/Textures/UI/tex_test001.tex_test001'"));  

 

可以用LoadObject加载的文件包括:

Texture、Material、SoundWave、SoundCue、ParticlesSystem、AnimMontage、BlendSpace(1D,2D,3D)、AnimSequence、AnimBlueprint、SkeletalMesh等等。这些文件的父类都是UObject,所以也可以先加载为UObject*然后再强转为具体的类型,例如:

Cpp代码   收藏代码
  1. UObject* Obj = LoadObject<UObject>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));  
  2. USkeletalMesh* MyMesh = Cast<USkeletalMesh*>(Obj);  

 

  

另外有两个全局函数叫:StaticLoadObject()和StaticLoadClass(),应该是LoadObject<T>()和LoadClass<T>()的早期版本,前者需要手动强转,后者使用模版封装过,使用更方便,推荐使用后者

<think>嗯,用户问的是关于Tsubofclass<UMyObject> Object = UMyObject::StaticClass()这段代码的解释。首先,我需要确定用户的使用场景。看起来他可能在用Unreal Engine,尤其是涉及到UMyObject这样的UClass。用户可能是刚接触UE的开发者,对模板静态函数不太熟悉。 接下来,分解代码。TSubclassOf是一个模板类,用于安全地存储UClass的指针,确保类型安全。这里模板参数是UMyObject,所以TSubclassOf<UMyObject>只能接受UMyObject或其子类的类引用。然后Object被赋值为UMyObject::StaticClass(),这里StaticClass()UE的宏生成的静态函数,返回该类的UClass*。 需要解释每个部分的作用:TSubclassOf的用途,为什么用模板,StaticClass()的作用,以及这样赋值的好处,比如类型安全,避免运行时错误。可能用户在实际使用中需要创建该类的实例,或者作为函数参数传递,确保传入正确的子类。 还要考虑用户可能的疑问,比如为什么要用TSubclassOf而不用直接UClass*,这时候需要强调类型安全的重要性,避免错误的类类型被赋值。另外,可能需要举例说明如何使用Object来生成实例,比如通过NewObject或SpawnActor,但具体函数取决于上下文。 最后,总结整个语句的意义,强调在UE开发中的常见应用场景,比如蓝图子类指定或动态加载资源时的类型检查。确保用户理解这样写法的优势正确用法。</think>在Unreal Engine开发中,这个语句涉及两个重要概念,我将分步解释: 1. **TSubclassOf<UMyObject>** - 这是Unreal Engine特有的模板类,用于实现安全的UClass类型封装 - `<UMyObject>`模板参数指定了允许存储的基类类型 - 作用:保证该变量只能存储`UMyObject`类或其子类的引用,提供编译时类型安全检查 - 对比直接使用`UClass*`的优势:避免运行时因类型不匹配导致的崩溃 2. **UMyObject::StaticClass()** - 这是通过UE的`UCLASS()`宏自动生成的静态方法 - 返回值为`UClass*`类型,表示该C++类对应的反射系统元数据 - 对于继承自`UObject`的类,这个方法始终返回正确的类引用 3. **完整语句解析** ```cpp TSubclassOf<UMyObject> Object = UMyObject::StaticClass(); ``` - 创建一个类型安全的类引用容器 - 将`UMyObject`自身的类元数据赋值给该容器 - 后续可以安全地用于: ```cpp AActor* NewActor = World->SpawnActor<AActor>(Object, ...); ``` 或 ```cpp UMyObject* Obj = NewObject<UMyObject>(GetTransientPackage(), Object); ``` 4. **典型使用场景** - 在蓝图可调用函数中指定允许的子类类型 - 数据资产中配置需要实例化的具体类型 - 避免硬编码类名,支持派生类的灵活替换 注意在UE5中仍然需要保持类型安全的最佳实践,当需要动态加载类时,应该使用: ```cpp TSubclassOf<UMyObject> LoadedClass = LoadClass<UMyObject>(...); ``` 而不是直接的类型转换,这能有效防止因资源错误导致的运行时崩溃。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值