十二、蓝图与C++:实例化Actor与UObject
一.蓝图中实例化蓝图Actor

1.创建一个将要实例化的Actor命名BP_Actor,添加一个静态网格体组件

2.创建一个蓝图类:BP_SpawnActor,用来实例化BP_Actor

二.C++中实例化蓝图Actor

1.新建一个基于Actor的C++类:Cpp_SpawnActor
.cpp文件
解析:
①LoadClass:因为C++无法直接识别蓝图类,所以需要使用LoadClass将蓝图类的类型加载出来.使用语法:
LoadClass<基类类型(可以直接用AActor)>(NULL,资源引用);
资源引用获取方式在上篇中讲过了,这里要注意的是:需要在资源引用后面加一个"_C",否则蓝图类型无法被正常加载.
②GetWorld:这个很好理解,想要在世界中生成对象,总要先确定是在哪个世界生成.
③SpawnActor:这个函数有很多重载,上图是其中一种用法,语法为:
SpawnActor<类型>(确切类型,Transform));
类型:必须是C++可识别的,蓝图类可以直接用AActor
确切类型:通过LoadClass加载出来的类型
Transform:rotation,location,scale等信息
与蓝图对应关系如下:

三.C++中实例化C++类
上篇我们创建了一个C++的类:Cpp_AddComponent,用来Spawn这个C++类

.Cpp文件
解析:
①因为C++可以直接识别C++类(ACpp_AddComponent),所以就不用LoadClass了,尖括号中可以直接写入该类型
②C++类获取类型很简单,无需加载,直接类名::StaticClass()即可获得
四.C++中实例化不确定类型的蓝图Actor
在目录二中我们直接用C++Spawn出一个BP_Actor的蓝图类,假如我们不固定这个蓝图类该怎么办呢?想要生成任意actor类型,这就要求生成的类型不能写死,我们可以使用TSubclassof来实现

.h文件

.cpp文件

解析:
用法:TSubclassOf<基类类型>变量名;
五.蓝图中实例化UObject
在蓝图中我们实例化最多的UObject其实就是UserWidget(基类为UObject),蓝图中的CreateWidget节点在指定要生成的Widget类型之前,节点名称为Construct NONE

创建一个基类为object的蓝图类:BP_Object

解析:
①Outer表示该Object的所有者,需要连入一个UObject或者Actor,否则会报错
②CreateWidget其实就是ConstructObjectFromClass的一个特殊版本,多了一个筛选功能,只会显示UserWidget类型
六.C++中实例化UObject
C++中实例化UObject非常类似于原生C++中的new关键字,不过由于UE有自己的一套内存管理机制,所以不能使用new关键字来实例化UObject对象.我们需要通过NewObject关键字实例化UObject对象
1.创建一个基类为Object的C++类:Cpp_Uobject



2.在C++中实例化UObject:Cpp_Uobject

解析:
NewObject是一个模板函数,语法格式为:
Type* Obj=NewObject<Type>();
NewObject有多个重载,一般使用上面这个无参数的版本即可.