UE4 – 学习笔记之五 (总结二三四)
虚幻4的Engine模块 为了方便查看类关系,您可以点击这里在新标签中查看大图: 点我查看大图 Gameplay框架: Actor是一个游戏玩法实体,通常包含一个或多个Component,在游戏过程中可以静态地放置在Level中或通过Spawned动态生成,并支持多人游戏的网络复制。所有的Actor都从AActor类延伸出来,这个类是可重构游戏对象的基类。 需要注意的是,AActor有一个子类AInfo(不进行渲染而只进行信息的存储),之所以继承于Actor的原因大概是想利用Actor已经实现好的各种基本功能,尤其是网络复制,尽管AInfo不进行渲染,但很多也需要进行网络同步的 从某种意义上讲,Actor可以被认为是容纳特殊类型对象(称为组件)的容器。例如,一个CameraActor包含一个CameraComponent。但是这不是绝对的,功能也能通过自己的Actor对象的代码实现,但这明显不是一个最好的解决方法,因为要考虑重用性的问题,这样,各种各样的功能组件可以被用在各种的Actor上,如下图将CameraComponent附加到Pawn上 Pawn类那些可以由玩家或AI控制的所有Actor的是基础类(也继承于Actor)。Pawn是World范围内玩家或AI实体的物理表征。这不仅意味着Pawn决定了玩家或AI实体在视觉上的外观,还意味着它在碰撞和其他物理交互方面与世界的交互方式。Pawn代表游戏中玩家或实体的物理位置,旋转等。一个Character是一种特殊类型的Pawn,它有人型的走动,动画等功能。 它们之间的使用差别:如果游戏的主角们是各种各样的球体的,而玩家只能控制球体的滚动,这个时候只需使用Pawn就行,但如果游戏是一个写实的风格,需要一个人形的角色,直接使用Character会很省事,它已经集成了很多人形角色的功能和组件。 以下是官方的区别解释: 默认情况下,Controller和Pawns 之间有一对一的关系,即每个控制器在任何给定时间只控制一个Pawn,但是也能设置为一对多。此外,游戏过程中Spawned的Pawn不会被Controller自动Possess,需要自己增加逻辑调用Controller的Possess函数。 主要有两种子Controller: PlayerController和AIController PlayerController是由玩家进行控制的,AIController则是电脑计算的控制器 以下是Controller的官方描述 为了网络游戏中其它Player信息的传递,还有一个Info类:Player State PlayerState是为服务器上的每个玩家(或在独立游戏中)创建的。玩家状态被复制到所有客户端,并且包含关于玩家的网络游戏相关信息,例如玩家名称,分数等。 如下图所示的那样:PlayerState是被Controller所包含的,但是需要注意:一般AIController是没有自己可用的PlayerState的。 以上就是Pawn,Controller和PlayerState之间的联系 以下是PlayerState的官方解释: 接下来是游戏模式和游戏状态的类,顺带提及GameSession 有两个主要类处理关于正在玩的游戏的信息:Game Mode和Game State 即使是最开放的游戏也有规则的基础,这些规则组成了Game Mode(只在服务器上,一般只存放不变的量)。在最基本的层面上,这些规则包括: 参加游戏的Player和观众的数量,以及Player和观众的最大数量。 玩家如何进入游戏,其中可能包括用于选择spawn位置和其他spawn/respawn行为的规则。 是否可以暂停游戏,以及如何暂停游戏。 关卡之间的转换,包括游戏是否应以电影模式开始。 总的来说GameModeBase定义正在玩的游戏。它管理着游戏规则,得分,在这种游戏类型中允许哪些演员存在,以及谁可以进入游戏。 它只在服务器上实例化,并不会在客户端上存在。 在C ++ UGameEngine :: LoadMap()中为游戏玩法初始化关卡时,GameModeBase actor被实例化 。 此GameMode actor的类由在World Settings中设置的GameMode Override值或游戏的Project Settings中设置的DefaultGameMode条目确定。 这个类的主要内容即是管理游戏规则,defalut玩家Pawn的管理,玩家加入游戏的行为和初始化(HUD)。与GameSession不同,GameModeBase是上层的规则,它没有具体到Player的操作,GameSession则是一个具体的一次会话实例 比如:它的InitNewPlayer(): 1.在session上注册player GameSession->RegisterPlayer(NewPlayerController, UniqueId.GetUniqueNetId(), UGameplayStatics::HasOption(Options, TEXT(“bIsFromInvite”))); 2.Find a….