梳理图



各类职责
知识点
AActor是UE继承层级中第一个支持网络复制的类,UObjerct对象必须作为子对象被actor持有同时开启复制选项后才会被复制(比如AActor上的各个组件)
UActorCompoment是所有组件的基类,一搬来实现只有逻辑功能没有视觉效果的组件,添加没有视觉效果的组件将会排列在组件列表的下半部分
一搬Actor都会有一个USceneComponent类型的RootCompoment成员组件来支持Actor在世界中位置摆放
AInof是一个信息型的Actor,需要生成在世界中,但又不需要渲染显示不发生物理交互的Actor,充当特定关卡的管理者以及数据源的类型
UGameInstance是一个全局单例,从游戏开始到结束一直存在,一般用来管理跨月不同关卡的一些数据(不参与网路复制,仅仅代表游戏本身)
ULevel玩家实际体验内容的场景,Actor都放在ULevel中,持有关卡蓝图对象和世界设置对象,关卡蓝图可以方便引用放置在Level里面的Actor对象,世界设置类型则存放关于当前level的一些数据
UWord负责协调不同Level之间的切换、加载和卸载
一个word必须有一个持久性关卡作为一个基础关卡,一个持久性关卡可以有多个子关卡
在编辑器下是存在EditorWord和PIEWord,拜访时是EditorWord,paly后是PIEWord
APlayerController是玩家的代理,负责外部设备输入,并转为游戏玩家行为(多人联机服务器玩家都会存在这个)
APlayerState,派生于AInfo,由PlayerController持有并未以,用来存储玩家专属信息(服务器客户端都存在)
AAIController游戏中非玩家控制的角色控制器,挂载了AI所需组件,通常作为AI逻辑启动位置(仅在服务端存在)
APawn是可以接收controller输入并做出反映的角色,是所有可被玩家和AI控制的基类(服务器客户端存在)
ACharacter是Pawn专业化子类,专为CharacterMovementCompoment(人物)设计,CMC提供了完整的角色移动解决方案,支持网络同步和预测
AGameStateBase派生于AInfo,存储所有玩家该知道的游戏信息,同时存在双端
AGameModeBase派生于AInfo,用来定义特定关卡的规则,管理游戏流程(server存在)
UUserWidget用来创建游戏UI界面,UMG系统核心
AHUD早期是绘制UI元素,现在常用来管理UUserWidget,默认关闭网络复制功能
总结
UObject提供了反射、垃圾回收、序列化等,是所有蓝图的根,AActor作为游戏世界实体,通过UActorCompoment和USceneCompoment或得逻辑与空间能力,AInof提供当前挂起阿德管理和数据支持。
UGameInstance管理跨越挂签的全局数据;UWord曾在并调度ULevel,ULevel则承担挂关卡中所有Actor引用。
表示玩家角色的APawn或ACharacter由APlayerController驱动,AI角色则由AIController驱动。
游戏规则自由AGameModeBase执行,公共状态有AGameStateBase在多端同步。
UI由UUserWidget构建,AHUD用来管理UI显示
各类初始化顺序
一般使用BeginPaly来执行一些初始化行为,需要了解初始化顺序,以避免先后执行问题导致异常。
Actor生命周期
Actor是由多个组件组成,初始化会先进性组件初始化

PreInitalizeCompoments和PosInitalizeCompoments是可以被子类覆盖函数,InitalizeCompoments会调用所有组件的InitalizeCompoments函数(组件会被先激活再调用本初始化函数),完成初始化后,才会执行BenginPlay(c++中直接覆盖BeginPlay函数,蓝图则对应的是ReceiveBeginPlay)。
蓝图Actor的BeginPlay函数在执行完一些准备工作公才会触发ReceiveBeginPlay函数;C++中则是重写BeginPlay函数后会生成一个Super::Beginpaly(这里就是去调用蓝图里的ReceiveBeginPlay函数,注意这里顺序,可以参考知乎上的一篇文章)所以写代码时要考虑本问题
一个Actor从Spawn --> Initalize -->BeginPaly一般只在一帧内完成(SpawnActor ),但是如果使用UWord::SpawnActorDeferred时,只构造不初始化,需要手动调用AActor::FinishSpawning才会触发初始化,这种延迟初始化有机会干预其属性配置或组件状态。蓝图中则是对应成员变量勾选ExposeOnSpawn后,使用Spawn节点直接设置成员变量值。

BeginPlay后的下一帧才会执行Tick,和BeginPlayer一样,C++覆盖Tick函数,蓝图则是ReceiveTick函数,同时也要注意C++重写后的ReciveTick位置。
执行了如下操作后,都会触发Actor的EndPlay函数,首先EndPlay就会执行UninitializeCompoment函数对所有组件反初始化,随后Actor就会把自己和所有组件标记为垃圾,把自己从ULevel中移除,等代理及系统进行内存回收。

简化初始化顺序

评论