Unreal Gameplay Framework
UObject
引擎里几乎所有类的基类
可以通过额外的设置来实现网络复制
常用代码片段:
1 | // 创建UObject |
下面的类名都会省略前缀
Actor
继承自
UObject
, 场景中所有物体 (可见或不可见) 都属于Actor
。Actor
本身没有变换组件,需要依赖于RootComponent
(属于SceneComponent
)
Actor
有网络复制功能, 自带伤害判定逻辑
常用代码片段:
1 | // 构造函数里调用,开启网络复制 |
常用成员:
1 | BeginPlay // Actor被构造并完全初始化后调用 |
ActorComponent
依附于
Actor
的组件,其子类SceneComponent
有变换组件,可以设置相对位置和层级关系(通过SetupAttachment
)
常用代码片段:
1 | // 在构造函数里添加组件 |
常用成员:
1 | TickComponent // 每帧调用 |
Pawn
继承自
Actor
,其子类Character
自带SkeletonMesh
,CharacterMovementComponent
等组件。可以在GameModeBase
里指定具体的Pawn
类型,也可以通过SpawnDefaultPawnAtTransform
来生成
在多人游戏里,如果有n
个玩家,那么客户端和服务器都有n
个Pawn
实例,玩家死亡和重生对应着销毁和重生相应的Pawn
,所以玩家生命周期里的数据都应该放在Pawn
里。
常用代码片段:
1 | // 获取Pawn |
PlayerController
代表一个玩家,通过接收玩家输入来控制多个或零个
Pawn
。例如弹出菜单这样的功能应该由PlayerController
而不是Pawn
来控制。PlayerController
有一个PlayerCameraManager
,控制着当前朝向、相机变换组件和相机抖动效果。PlayerController
还控制着一个HUD
(通常可用UMG
代替)
当一个玩家加入GameMode
时,GameModeBase
会调用Login()
为他创建一个PlayerController
。
在多人游戏里,如果有n
个玩家,那么PlayerController
的数量是: 每个客户端都有一个,而服务器有n
个。所以当所有玩家需要某个玩家的数据时,这个数据应该放在Pawn
或者PlayerState
里,而不是PlayerController
(后面介绍Pawn
会解释)。
常用代码片段:
1 | // 获取PlayerController |
AIController
控制游戏里的AI,
AIController
上会运行一个BehaviourTree
, 控制AI所有的视听等感知数据。
Pawn
可以设置AutoPossesAI
来自动生成AIControllerClass
里指定的控制器。可以通过Pawn
获取AIController
。
GameModeBase
指定
PlayerController
,Pawn
,HUD
,GameState
,PlayerState
的类型, 设置游戏规则以及生成玩家。子类GameMode
还具有虚幻争霸里用到的诸如MatchState
等特性,但是一般还是实现自己的GameModeBase
。
在多人游戏里,只有服务器上存在GameMode
实例,所以要保存的数据应该放到GameState
(存在于所有客户端上)。
常用代码片段:
1 | // 获取GameMode |
HUD
由
PlayerController
通过SpawnDefaultHUD
生成一个AHUD
,然后由GameModeBase
通过InitializeHUDForPlayer
初始化指定的HUDClass
。
一般还是UMG
用的比较多。这些UI只存在于客户端上,注意生成任何控件前都要先检查IsLocalController
。
常用代码片段:
1 | // 获取HUD |
World
代表一个关卡,里面包含所有的
Actor
和组件。射线检测都要通过World
来执行(比如LineTraceSingleByChannel
)。
常用代码片段:
1 | // 获取World |
GameInstance
在整个游戏过程中只有一个。可用于处理网络故障, 加载游戏设置, 关卡共享数据等与关卡无关的东西。在游戏开发初期一般用不到。
常用代码片段:
1 | // 获取GameInstance |
PlayerState
保存一个玩家的数据(可在多个客户端之间复制, 不会跟
Pawn
一样被销毁),本身不包含什么逻辑。由Controller
通过InitPlayerState()
生成指定的PlayerStateClass
(可以在GameMode
的构造函数里指定)
只对于多人游戏比较有用
常用代码片段:
1 | // 获取PlayerState |
GameStateBase
类似于
PlayerState
,不过保存的是GameMode
里的信息。子类GameState
和GameMode
一样还包含了一些特定的东西,如果游戏模式继承自GameModeBase
,那游戏状态就也要继承自GameStateBase
,反之同理。
GameStateBase
存在于服务器和所有客户端上,因为GameModeBase
实例只存在于服务器上, 所以客户端要获取当前游戏信息都要通过GameStateBase
(比如游戏时间和分数等)
常用代码片段:
1 | // 获取 |
GamePlayStatics
静态类, 有许多通用的游戏函数,比如
PlaySound
,SpawnEmitter
,SpawnObject
,ApplyDamage
,GetPlayerPawn
,GetPlayerController
等。
所有函数参考: UGameplayStatics | Unreal Engine Documentation
常用代码片段:
1 | // 用法 |