简介
AController继承于AActor,一个Pawn只能被一个Controller控制,一个Controller也同样只能控制一个Pawn。但是Controller和Pawn并没有要求一定要同时存在。
使用玩家输入或者AI逻辑控制Pawns
-
Controller是一个负责指导Pawn的Actor。它们通常有两种版本,AIController和PlayerController。控制器可以“拥有”一个Pawn来控制它。
-
PlayerController是Pawn与玩家控制他之间的接口。其代表了玩家的意志。
-
AIController是一个可以控制Pawn的模拟意志。
由于Controller的生命周期比Pawn要长一些,因此对于那些公共的Pawn的功能逻辑I可以将其放置在Controller级别。
例如有两个种族。都能复活,这时候将两个种族的Pawn的复活功能抽取到Controller级别更好。主要就是放些公共可抽离的逻辑。
设计思路分析
目的
-
与Pawn有关联关系
-
可以自由的选择控制某个Pawn
-
能够脱离Pawn存在
-
控制Pawn的生成和销毁
-
自己本身也能通过配置生成
-
可以监听事件响应
-
一直都在Tick
-
拥有状态
-
拥有一定的扩展继承组合能力
-
可以保存数据状态
-
可在世界里移动
-
可探查世界的对象
-
可网络同步
如何实现?
在仔细考察了"控制"的需求和手头上的原料之后,我们试着从UE的角度来权衡一下。
首先Controller不能是一个Component,
(一)是因为Component的层级太低,表达的是功能的概念而非逻辑;
(二)是Component必须依附于Actor存在,而我们的Controller希望能独立存在。
(三)其次如果从UObject直接继承下来UController,倒是也可行,UObject也能复制同步,其他的控制Pawn的能力和事件响应等倒也是能改改接口想想办法,但是要想在世界里移动,就得有个位置表示,再加上还希望能容纳Components,这就麻烦了,基本就是把Actor的工作再做一套,有点累人,搞起来也怕两套班子出错闹矛盾。
(四)再来考察下从AActor继承下来AController怎么样,Actor比Object多了一些我们正需要的配置动态生成、输入事件响应、Tick、可继承、可容纳Component、可在世界里出现、可在网络间同步。
(五)好了,现在就差控制Pawn的能力,那我们就在这个分化出来的AController增加一些控制Pawn的接口,这个思路正是和我们从Actor从分化出Pawn的时候不谋而合!