一. Actor 和 Component
1.1 创建 Actor 的两种方式
- 静态创建:直接在场景中编辑拖拽,创建由引擎构建场景时进行创建
- 无需编码,更加直观简单
- 但会影响游戏启动速度,增加场景构建负担
- 动态创建:通过编码动态进行生成
- 复杂度上升
- 但可控性更强,动态生成的Actor会持有有效的操作指针,我们可以根据实际情况进行生成,更加灵活
1.2 SpawnActor函数
- C++中,通过UWorld指针进行创建生成Actor
- SpawnActor函数是个工厂函数 ( UWorld | Unreal Engine Documentation )
1.3 创建Actor
- ① 在头文件中,对其父类函数BeginPlay和Tick进行虚函数重写
//在MyGameModeBase.h文件 UCLASS() class UE_C_API AMyGameModeBase : public AGameModeBase { GENERATED_BODY() public : //虚函数重写 virtual void BeginPlay()override; virtual void Tick(float DeltaSeconds)override; }; 复制代码
- ② 在 .cpp 文件中,定义BeginPlay和Tick函数
//在MyGameModeBase.cpp文件 void AMyGameModeBase::BeginPlay() { } void AMyGameModeBase::Tick(float DeltaSeconds) { }
- ③ 调用函数SpawnActor()
//在MyGameModeBase.cpp文件 void AMyGameModeBase::BeginPlay() { //调用父类同名函数(Super相当于父类) //Super::BeginPlay(); //1.调用函数SpawnActor(): GetWorld()->SpawnActor<AActor>(); //2. GetWorld()->SpawnActor(AActor::StaticClass()); //GetWorld 获得当前运行世界实例指针(全局函数 UWorld类型对象) //SpawnActor 是 UWorld类的一个成员函数(工厂函数),帮助我们在场景中生成Actor //AActor::StaticClass() 是一个类的实例数据(类型是 UClass) //3. UWorld* world = GetWorld(); world->SpawnActor<AActor>(); //4.滞后生成 Actor: //创建一个 UWorld类对象的指针 UWorld* pWorld = GetWorld(); //创建一个 FTransform FTransform tran; //滞后生成 Actor AActor* pActor = pWorld->SpawnActorDeferred<AActor>(AActor::StaticClass(), tran); //确定生成对象到世界 pActor->FinishSpawning(tran); } void AMyGameModeBase::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); }
- ④ 上面采用了4种方式创建Actor,编译后运行结果如下:
- 虚幻中除了使用模版构建对象外,还增加了映射关系,可以将类作为对象构建依据,这可以方便的将类提供给蓝图使用
- 注意:C++本身是编译型语言,在编辑器中看到的文件类并不是真正的C++类,只是编译后生成的映射文件
1.4 Actor 生命周期
- ① Actor的创建分为两种方式,两种方式的创建有细微差异,但总体不大,基本分为以下流程:
-
构造函数调用
-
初始化成员变量
-
(如有蓝图,则初始化蓝图数据)
-
构建组件
-
BeginPlay(标志着Actor被创建到世界当中)
-
Tick
-
-
② 消亡Actor
//创建一个 UWorld类对象的指针 UWorld* pWorld = GetWorld(); //创建一个 FTransform FTransform tran; //滞后生成 Actor AActor* pActor = pWorld->SpawnActorDeferred<AActor>(AActor::StaticClass(), tran); //确定生成对象到世界 pActor->FinishSpawning(tran);
//调用自身Destroy函数进行强制消亡操作 pActor->Destroy(); //滞后5秒删除 pActor->SetLifeSpan(5);
-
Destroy函数
-
参数说明:
-
bNetForce 是否强制网络同步删除
-
bShouldModifyLevel 主要是用来控制先删除actor再修改关卡,还是先修改关卡再删除actor,默认是true,即为先修改关卡,再删除actor(修改关卡即为把actor先移除出场景)
-
-
SetLifeSpan函数
-
参数说明:
- 设置延时删除(单位秒)
-
-
- ③ 消亡Actor通知
-
Destroyed函数
-
当对象被删除时(非内存删除)进行回调操作
-
-
EndPlay函数
-
对象被彻底清除时回调,回调会进行删除类型通知
-
-
- ④ 删除类型介绍
-
Destroyed:当actor或是component彻底被删除时(内存中)
-
LevelTransition:关卡切换时删除回调(非关卡流)
-
EndPlayInEditor:编辑器关闭时,回调通知
-
RemovedFromWorld:关卡流切换被释放时调用
-
Quit:游戏退出时被删除回调
-
临时草稿
未完待续...
标签:架构,函数,删除,创建,Actor,UE,UWorld,GamePlay,SpawnActor From: https://www.cnblogs.com/ZWJ-zwj/p/16954240.html