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 | // 用法 |