概述
所谓的引擎,一般都是先要学习下引擎的主要框架。对于UE来说,一般先要去看下gameplay。这篇简单写下个人理解。关于框架类的关系,可以参考下下图:
Actor
UE中Actor是放置或者生成的对象的基类。关于Actor的加载方式,这个之前写过一篇,可以参考下。UE Actor生命周期
GameMode
上图,可以看出,Game里边,GameMode和GameState是非常重要的组成部分。接下来了解一下GameMode。
对于游戏来说,都有一些基础规则,比如:
- 出现玩家和观众,以及允许多少玩家
- 玩家进入的方式,比如出生地点和其他生成/重生等规则
- 游戏是否可以暂停,以及如何处理游戏暂停
- 关卡之间的过渡,包括游戏是否以动画模式开场
来看下Lyra里边的GameMode的规则,如下:
从上图可以看到,ALyraGameState,ALyraGameSession,ALyraPlayerController,ALyraReplayPlayerController,ALyraPlayerState,ALyraCharacter,ALyraHUD都是在这里初始化的。
GameState
Game State 负责启用客户端监控游戏状态。从概念上而言,Game State 应该管理所有已连接客户端已知的信息(特定于 Game Mode 但不特定于任何个体玩家)。它能够追踪游戏层面的属性,如已连接玩家的列表、夺旗游戏中的团队得分、开放世界游戏中已完成的任务,等等。
以上部分来源于官方文档。我觉得对于一些非职业游戏开发者来说,不是那么容易理解的。我来说下我的看法,对于gamestate,主要用于存储整个游戏全局的信息,比如,包括当前玩家的信息,如果是多人游戏,还要包括多人的玩家信息。当然对于每个人的信息,在PlayState里边。如下图:
lyra里边,就放在lyraPlayState里。如下图:
。
控制器(Controller)
控制器(Controller) 是一种可以控制Pawn(或Pawn的派生类,例如角色(Character)),从而控制其动作的非实体Actor。人类玩家使用PlayerController控制Pawn,而AIController则对它们控制的Pawn实加人工智能效果。控制器用Possess函数控制Pawn,用Unpossess函数放弃控制Pawn。
控制器会接收其控制的Pawn所发生诸多事件的通知。因此控制器可借机实现 响应此事件的行为,拦截事件并接替Pawn的默认行为。 可以让控制器在给定的Pawn之前运行, 从而从而最大限度减少输入处理与Pawn移动之间的延迟。
默认情况下,控制器与Pawn之间存在一对一的关系;也就是说,每个控制器在任何给定的时间只控制一个Pawn。这对于大多数 类型的游戏都是可以接受的,但对于某些类型的游戏可能需要进行调整,因为实时策略可能需要能够同时控制多个实体。
对于Lyra来说,当然也有专门的控制器。如下图:
。在这个里边,包含了太多的内容,感兴趣,可以去看看源码。
摄像机(Camera)
摄像机,在UE中,它代表了玩家的视角,也就是玩家如何看待世界。对于我们游戏的主视角,playercontroller会去指定一个Camera Actor。关于CameraActor,如下图:
可以看到,CameraActor中,UCameraComponent这个组件主要操作相机。Lyra里,是直接用的ULyraCameraComponent这个组件,如下图:
。
用户界面和HUD
关于这块,用户界面,引擎底层主要是用slate框架写的。包括现在很多设计或者蓝图程序常用的UMG,都是基于slate。然后,很多项目采用一些继承机制,把UI分成多层,每一层有每一层的作用,也是很常见。至于这层,不同项目的解决方案不一样,不多说。
至于HUD嘛,这个举个例子,每个character上都有一些血量,经验值之类的,就是hud里做的。
小结
这篇主要写了以下UE的GamePlay的框架,包括GameMode,GameState,Controller,Camera,用户界面和HUD。其实,要看懂这些内容的底层代码,需要一定的C++功底,关于C++,可以去学习学习。OK,这篇结束。