虚幻引擎——万物皆为Actor
什么是Actor?
actor 指在舞台剧、电影、电视剧或广播剧中负责演出的角色
在UE中,3D世界是由Actor构建起来的,Acotor作为基本的组成要素,又拥有各式各样的Compeonent(元件),操纵Actor的工作教友各种controller来完成。在UE4中另外一个重要的概念就是BlueprinterestingClass(蓝图类)
综合起来,面对一个基础的Actor,可以添加一个蓝图,或者也可以选择添加一个Component,之后使用它来直接组织逻辑
在引擎中,为了模拟更加复杂的情景,需要使用到父子嵌套关系来呈现结构,从本质上来说,物理模拟,以及游戏逻辑等等诸多功能,都不过是为了实现对这些对象的操控
UE4是扎根于UObject来实现的,并且将命名更换为UClass。这个基础为UE4带来了非常多的便利,例如元数据,反射生成,序列化,编辑器可见,Class Default,以及GC垃圾回收等
Actor是独立于这个根基凭空产生的吗,并不是,Actor并不能摆脱UObjec的影响(实际上,UObject的影响是方方面面,全面且深远的)。基于UObject,Actor不同的部分在于Replication(网络复制)以及Spawn,Tick
Actor生命周期:SpawnActor,DestoryActor
一,生成GameInstance
UEditorEngine::CreateInnerProcessPIEGameInstance(FRequestPlaySessionParams & InParams, const FGameInstancePIEParameters & InPIEParameters, int InPIEInstanceIndex)
由此便生成了熟悉的GameInstance
二,生成GameMode
GetGameInstance()->CreateGameModeForURL
每一个在worldSetting中对umap设置的GameMode都是这样生成
(其实GameMode也是被Spawn出来的一个Actor)
Actor调用BeginPlay流程:场景开始对所有Actor初始化,首先判断是否已经初始化过了,会多次调用方法if(!AreActorInitialized())会多次。如果没有经历过初始化,则会调用代码
调用流程:1,UWorld::BeginPlay()
2,AGameStateBase::HandleBeginPlay()
3,AWorldSettings::NotifyBeginPlay()所有Actor在此初始化
4,DispatchBeginPlay(bool bFromLevelStreaming)
5,BeginPlay()真正意义上的ActorBeginPlay
初始化组件位置:
在类的构造函数之后,在BeginPlay之前(BeginPlay在放入关卡生成实例时进行)
如果在构造函数之后在代码中自定义组件,会因为错过组件初始化,导致组件无法注册因而创建失败——>根据组件的位置是否在构造函数当中,分为两种情况
一,在构造函数中,相应接口为CreateDefaultSubobject
二,在非构造函数中,即运行时创建组件,关键在于组件注册,因为组件在实例化之前就已经完成,因此为了确保能够创建组件,需要借助接口RegisterComponent,创建接口对象可以通过NewObject接口
AActor为什么重要?直观的显示在界面上,就是世界大纲列表中的所有物体,基本上都是AActor
未完待续,粗稿待后续补充修改