[UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
来源:互联网 发布:淘宝优惠券兑换链接 编辑:程序博客网 时间:2024/06/05 03:11
http://aigo.iteye.com/blog/2281558
原文作者:@玄冬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',
例子:
- UClass* Test = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/Blueprints/MapPathBrush_BP.MapPathBrush_BP_C'"));
官方还没出文档,只能先看代码注释:
- // Load an object.
- template< class T >
- inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
- {
- return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
- }
- // Load a class object.
- template< class T >
- inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
- {
- return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
- }
- /**
- * Find or load an object by string name with optional outer and filename specifications.
- * These are optional because the InName can contain all of the necessary information.
- *
- * @param ObjectClass The class (or a superclass) of the object to be loaded.
- * @param InOuter An optional object to narrow where to find/load the object from
- * @param InName String name of the object. If it's not fully qualified, InOuter and/or Filename will be needed
- * @param Filename An optional file to load from (or find in the file's package object)
- * @param LoadFlags Flags controlling how to handle loading from disk
- * @param Sandbox A list of packages to restrict the search for the object
- * @param bAllowObjectReconciliation Whether to allow the object to be found via FindObject in the case of seek free loading
- *
- * @return The object that was loaded or found. NULL for a failure.
- */
- 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 );
- COREUOBJECT_API UClass* StaticLoadClass(UClass* BaseClass, UObject* InOuter, const TCHAR* Name, const TCHAR* Filename = NULL, uint32 LoadFlags = LOAD_None, UPackageMap* Sandbox = NULL);
LoadObject加载例子,不需要添加后缀:
- 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*然后再强转为具体的类型,例如:
- UObject* Obj = LoadObject<UObject>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));
- USkeletalMesh* MyMesh = Cast<USkeletalMesh*>(Obj);
另外有两个全局函数叫:StaticLoadObject()和StaticLoadClass(),应该是LoadObject<T>()和LoadClass<T>()的早期版本,前者需要手动强转,后者使用模版封装过,使用更方便,推荐使用后者
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- [UE4]C++实现动态加载的问题
- \t\t动态数组的C++实现(转)
- 关于C::t的一些问题
- C常用函数t的实现
- CPU P和T的问题
- \t\ti++和++i的问题
- Nullable<T> 的实现
- 浏览器的实现t
- const T、const T*、T *const、const T&和const T*&的区别
- 当动态T-SQL语句遇到除零的问题
- \t\t写个小问题
- Action<T>和Func<T>的区别.
- IQueryable<T>和IEnumerable<T>的区别
- List<T>和Ilist<T>的区别
- <? extends T> 和 <? super T>的作用
- <? super T>和<? extends T>的区别
- 每日AC--leetCode--PalindromePartitioning--回溯法 递归实现
- C调用python
- ServletContext与Web应用以及Spring容器启动
- 2018校招web前端开发方向总结
- 题目456-邮票分你一半
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- Oracle数据类型之number(转)
- 如何判断是否是微信端登录
- 基本操作详解
- python3.6安装记录
- python使用webdriver爬取微信公众号信息
- 抓取线程状态
- Spring MVC和Struts2的比较的优点
- 用@ExceptionHandler 来进行异常处理