目录
UE4 引擎学习
一、架构基础
1. Pawn
(1)DefaultPawn
(2)SpectatorPawn
(3)Character
2. AController
3. APlayerState
4. 总结
UE4 引擎学习
一、架构基础
1. Pawn
UE也是从Actor中再派生出了APawn,并定义了3块基本的模板方法接口:
-
可被Controller控制
-
PhysicsCollision表示
-
MovementInput的基本响应接口
Pawn的又派生出三个子类:DefaultPawn,SpectatorPawn,Character。
(1)DefaultPawn
使用Pawn都得从Pawn派生过来,然后再一个个添加组件。UE提供了一个默认的Pawn:DefaultPawn,默认带了一个DefaultPawnMovementComponent、spherical CollisionComponent和StaticMeshComponent。。
(2)SpectatorPawn
观战的玩家们虽然也在当前地图里,但是我们并不需要真正的去表示它们,只要给他们一些摄像机“漫游”的能力。所以派生于DefaultPawn的SpectatorPawn提供了一个基本的USpectatorPawnMovement(不带重力漫游),并关闭了StaticMesh的显示,碰撞也设置到了“Spectator”通道。
(3)Character
Character是UE为我们直接提供的一个人形的Pawn来让我们操纵。像人一样行走的CharacterMovementComponent, 尽量贴合的CapsuleComponent,再加上骨骼上蒙皮的网格。同样的三件套,不一样的配方。
2. AController
控制器(Controller) 是一种可以控制Pawn(或Pawn的派生类,例如角色(Character)),从而控制其动作的非实体Actor。人类玩家使用PlayerController控制Pawn,而AIController则对它们控制的Pawn实加人工智能效果。控制器用Possess函数控制Pawn,用Unpossess函数放弃控制Pawn。
控制器会接收其控制的Pawn所发生诸多事件的通知。因此控制器可借机实现 响应此事件的行为,拦截事件并接替Pawn的默认行为。 可以让控制器在给定的Pawn之前运行, 从而从而最大限度减少输入处理与Pawn移动之间的延迟。
默认情况下,控制器与Pawn之间存在一对一的关系;也就是说,每个控制器在任何给定的时间只控制一个Pawn。这对于大多数 类型的游戏都是可以接受的,但对于某些类型的游戏可能需要进行调整,因为实时策略可能需要能够同时控制多个实体。
哪些逻辑应该由Controller掌管呢?可以从以下一些方面考虑:
- 从概念上,Pawn本身表示的是一个“能动”的概念,重点在于“能”。而Controller代表的是动到“哪里”的概念,重点在于“方向”。所以如果是一些Pawn本身固有的能力逻辑,如前进后退、播放动画、碰撞检测之类的就完全可以在Pawn内实现;而对于一些可替换的逻辑,或者智能决策的,就应该归Controller管辖。
- 从对应上来说,如果一个逻辑只属于某一类Pawn,那么其实你放进Pawn内也挺好。而如果一个逻辑可以应用于多个Pawn,那么放进Controller就可以组合应用了。
- 从存在性来说,Controller的生命期比Pawn要长一些,所以对于那些需要在Pawn之外还要持续存在的逻辑和状态,放进Controller中是更好的选择。
3. APlayerState
PlayerState表示的是玩家的游玩数据,所以那些关卡内的其他游戏数据就不应该放进来(GameState是个好选择),另外Controller本身运行需要的临时数据也不应该归PlayerState管理。而玩家在切换关卡的时候,APlayerState也会被释放掉,所有PlayerState实际上表达的是当前关卡的玩家得分等数据。
PlayerState我们可以通过在GameMode中配置的PlayerStateClass来自动生成。
注意,这个APlayerState也理所当然是生成在Level中的,跟Pawn和Controller是平级的关系,Controller里只不过保存了一个指针引用罢了。当前游戏有多少个真正的玩家,才会有多少个PlayerState,而那些AI控制的NPC因为不是真正的玩家,所以也不需要创建生成PlayerState。
4. 总结
UE在Pawn这个层级演化构成了一个最基本和非常完善的Component-Actor-Pawn-Controller的结构。
参考链接:《InsideUE4》GamePlay架构(五)Controller - 知乎 (zhihu.com)