目录
UE4仿真引擎学习
一、架构基础总结
1. 游戏世界
2. 数据和逻辑
3. 整体类图
UE4仿真引擎学习
一、架构基础总结
1. 游戏世界
在UE的眼里,游戏世界的万物皆Actor,Actor再通过Component组装功能。Actor又通过UChildActorComponent实现Actor之间的父子嵌套。
众多的各种Actor子类又组装成了Level。
你可以根据自己的需要定制化Level,比如有些Level是临时Loading场景,有些只是保存光照,有些只是一块静态场景。UE用Level这种细一些粒度的对象为你的想象力提供了极大的自由度,同时也能方便团队内的平行协作。
一个个的Level,又进一步组装成了World:
World允许多个Level静态的通过位置摆放在游戏世界中,也允许运行时动态的加载关卡。而World之间的切换,UE用了一个WorldContext来保存切换的过程信息。玩家在切换PersistentLevel的时候,实际上就相当于切换了一个World。而再往上,就是整个游戏唯一的GameInstance,由Engine对象管理着。
到了World这一层,整个游戏的渲染对象就齐全了。但是游戏引擎并不只是渲染,因此为了让玩家也各种方式接入World中开始游戏。GameInstance下不光保存着World,同时也存储着Player,有着LocalPlayer用于表示本地的玩家,也有NetConnection当作远端的连接。
玩家利用Player对象接入World之后,就可以开始控制Pawn和PlayerController的生成,有了附身的对象和摄像的眼睛。最后在Engine的Tick驱动下开始一帧帧的逻辑更新和渲染。
2. 数据和逻辑
按照MVC的思想,我们可以把整个游戏的GamePlay分为三大部分:表现(View)、逻辑(Controller)、数据(Model)。
3. 整体类图
从类的继承层次上,咱们再加深一下理解。下图只列出了GamePlay架构里一些相关的重要的类:
UE基于UObject的机制出发,构建出了纷繁复杂的游戏世界,几乎所有的重要的类都直接或间接的继承于UObject,都能充分利用到UObject的反射等功能,大大加强了整体框架的灵活度和表达能力。比如GamePlay中最常用到根据某个Class配置在运行时创建出特定的对象的行为就是利用了反射功能;而网络里的属性同步也是利用了UObject的网络同步RPC调用;一个Level想保存成uasset文件,或者USaveGame想存档,也都是利用了UObject的序列化;而利用了UObject的CDO(Class Default Object),在保存时候也大大节省了内存;这么多Actor对象能在编辑器里方便的编辑,也得益于UObject的属性编辑器集成;对象互相引用的从属关系有了UObject的垃圾回收之后我们就不用担心会释放问题了。
参考链接:《InsideUE4》GamePlay架构(十)总结 - 知乎 (zhihu.com)