泰兴做网站/厦门网络营销推广
UE4 | C++ | 实用知识汇总
文章目录
- UE4 | C++ | 实用知识汇总
- 0. 想要实现某个功能但是不清楚具体的实现方法
- 1. 非静态成员引用必须与特定对象相对
- 2.不允许使用的类类型
- 3.不允许使用不完整的类
- 4. 在指定文件夹中获取指定类型的uasset
- 5.获取World Outline中的各类Actor
- else
- 插件管理与使用
持续更新中…
0. 想要实现某个功能但是不清楚具体的实现方法
一般去这个网站
IsaraTech:https://isaratech.com/all-articles/
1. 非静态成员引用必须与特定对象相对
一般蓝图中的函数使用都有Target,对应的就是成员函数所在的实例化对象。
如果不清楚成员函数所在的类,可以使用ctrl
+shift
+F
来查找你需要的函数所在的类,然后实例化该类的对象,然后就可以使用 对象.函数
的形式调用非静态成员函数了。
p.s. 我们都懂static成员不能直接使用,问题其实主要是我们不知道这个函数所在的类类型和如何正确的调用它。
2.不允许使用的类类型
这种情况一般是使用类名::函数()
形式遇到的,解决方法同1,查找函数所在的类,实例化对象然后再去调用函数。
3.不允许使用不完整的类
去Bing搜索 UE4+类
,找到官方文档,把头文件包含进来。
4. 在指定文件夹中获取指定类型的uasset
使用资源注册表:
FAssetRegistryModule& AssetRegistryModule =FModuleManager::GetModuleChecked<FAssetRegistryModule>("AssetRegistry");
FARFilter filter;
TArray<FAsset> assets_list;
filter.PackagePaths.Add("/Game");
filter.ClassNames.Add(UMaterial::StaticClass()->GetFName()); //可以添加多种类型
filter.ClassNames.Add(UStaticMesh::StaticClass()->GetFName());
filter.ClassNames.Add(USkeletalMesh::StaticClass()->GetFName());
filter.bRecursivePaths=true; //true的话会递归目录;false的话只查找当前单一文件夹。
filter.bRecursiveClassed=true;
AssetRegistryModule.Get().GetAssets(filter,assets_list);
一般获取到的资源(assets_list里的资源类型还是UAsset
类型)需要转换为对应的类型,这个时候可以使用for循环+auto指针来遍历,并且使用以下形式获取指定类型的单个uasset到变量中:
需要的类型名 *变量=Cast<需要的类型名>assets_list[下标].GetAsset();
示例如下:
UMaterial *material_Asset;
for(auto asset:assets_list){if(Cast<UMaterial>(asset.GetAsset())){ //Cast之前最好有一个if判断material_Asset=Cast<UMaterial>(asset.GetAsset());}}
5.获取World Outline中的各类Actor
需要引入UGameplayStatics对应的头文件,使用的是蓝图和C++中均可以调用的函数GetAllActorsOfClass(世界指针,Actor类型,输出的TArray数组)
, 函数有三个参数:
第一个参数为World *
类型,一般我使用的是GWorld
变量;
第二个参数一般使用Actor类名::StaticClass()
;
第三个参数是你自己创建的TArray容器;
示例如下:
#include "Kismet/GameplayStatics.h"
TArray<AActor*> actors_List
UGameplayStatics::GetAllActorsOfClass(GWorld,AStaticMeshActor::StaticClass(),actors_List);
需要注意的是之后遍历actors_List的时候如果使用actor的名称来匹配的话绝对不要直接用变量的名字,而是需要使用变量的ID,你把鼠标移到变量上就能看见对应显示的ID,这个才能用来进行匹配。
else
插件管理与使用
最近做的项目中使用了别人提供的开源插件,并且自己也写了三个插件,这里记录一下所学到的小知识。
- 自己编写的插件可以很方便的移植到别的项目,只需要把对应的文件夹复制过去,然后在
uproject
的启动过程中就能够自动识别plugins
文件夹中的插件。 - 需要注意的是在 VS 中编译插件的时候使用
develop
模式,这样改动才能编译进 binary 文件夹。 - 编译文件的时候 include 头文件有时候会报错,其中有一些 private 文件夹内的文件是不能 include 进来的,只能 inlude Public 文件夹内的文件。