Unreal引擎的编程架构,通过了解他我们能了解引擎是如何工作的,以及开发者希望我们如何进行游戏开发
UE编程架构
类图
这是这两个月来接触到的部分,更多的部分要靠大家填充啦~
如果你是看了上一篇文章过来的新手玩家话,还请向下看
为什么要了解?
简单说有两个作用:
- 知道我需要的方法/属性可以从哪里获取
- 明确自定义的方法应该放在那个类中,放在其中会有什么效果
对于第一点来说,是刚接触引擎时最需要的东西,可以减少开发时的很多迷茫。
对于第二点,还记得上篇文章中我们自定义的Character吗?在Character中我们设置了一个属性使得玩家出生在世界中心,你可能会想到一个问题:如果在开发中途我们换了一个character,那岂不是之前写的那个功能需要重新写一遍?这就是了解编程架构的意义所在了,当我们把功能写在character中的时候,编程逻辑为:我们创建了一个名为leafhan的MyCharacter,并且设置Born in Centre为true, 所以地图上所有的leafhan(如果有多个的话)都会出生在世界中心。当我们把Born in Centre的逻辑放在PlayerController中的话,则编程逻辑为:我们控制的那个角色会出生在世界中心。所以为了实现不同的功能,我们需要在不同的地方需要的方法。
所以这些类的含义是什么?
UObject
所有类的父类,如果你对Java有所了解的话可以很方便的理解它,最重要的点在于它提供了一个统一的调用接口,你可以在源码中看到PreSave,preloading,beginDestory等操作,通过统一的接口可以实现对象管理,垃圾回收等机制。
AActor
对于Actor,在我这个新手的角度看最直观的三个扩充为:
- 拥有了Transform的属性,可以设置位置了
- 可以拥有Component,通过Component拓展自身功能
- 提供了诸如OnClicked, EndPlay等事件
官网对于Actor的解释很完善,如果你觉得不好理解的话可以先理解为:一个具有位置坐标的抽象体,可以通过增加Component来使得抽象体不断的细化,最终具有一定的功能或者表象。
UActorComponent
UActorComponent就是上面所提到的Component的基类,你可以将Component理解为一种挂件,用于附着在某个Actor上用于拓展它的功能。所以在其内部除了Create,Destroy的声明周期外,还有Register,Active等接口,用于绑定或者激活组件。
USceneComponent
Component的作用是附着在Actor上的,但SceneComponent除了Actor也可以附着到Component上,这是它的一个重要的特性。这也就意为着它也需要Transform来确定它附着的位置,由于有多重附着的可能,所以Transform分为两套,Relative显示相对于父控件的位置,World设置相对于世界的位置。
Apawn
Pawn是玩家的物理存在,这里的“玩家”不仅仅指的是玩游戏的角色,也包括游戏AI所控制的角色。它主要的功能是获得Controller的一些输入。在它的一些子类中,会添加运动组件、碰撞组件等一系列组件在标识当这个pawn在获得一个输入之后该如何具体表现。注意,Pawn不一定是人形的,也可以是一个猴子,飞机,或者其他奇奇怪怪的东西。
ACharacter
Character是Pawn的一个子类,增加了运动和碰撞组件以便对输入做出相应的相应。Character是人形的(还记得上篇文章中自定义的那个Character吗),也拥有骨骼胶囊体这样的组件,它已经和我们常见的游戏角色没什么区别了。新加了jumping,falling,moving等一系列接口。
AController
Controller是Pawn的控制器,它的主要作用是表现玩家的意图,例如开火,向某个方向跑步,展开自己的翅膀(如果有的话)。可以认为Controller就是玩家意图的化身,所以它是与玩家绑定的而不是某个Pawn,这意味着玩家可以与pawn解耦开。如果我想的话我可以一会儿控制人物,一会儿控制飞机,一会儿控制飞行中的导弹。这种解耦的方式使得我们实现多样化的需求。
AInfo
所有游戏信息的基类,在这个类中需要注意的是,有些信息会出现在客户端,有些信息仅出现在服务器,有些信息两边都会出现,所以在编程的时候需要分清楚~
APlayerState
PlayState会复制到所有的客户端,服务器上也会围护一份PlayerState的复制,用来记录玩家状态
AGameStateBase
GameStateBase会存放在服务器以及所有的客户端,用来记录游戏中的一些公共信息(游戏进度,世界Boss之类的)
AGameModeBase
GameMode讲的是一种游戏规则(玩家数量,游戏事件,哪些功能开启之类的)关于这一点官网教程讲的很全面,就不赘述了。
写在后面
了解了编程架构,我们就可以解决两个问题:
- 某项属性或方法(例如已经进行的游戏时间)应该在哪里获得
- 自己想要添加新的功能,应该放在哪里
接下来如果需要去研究某个方面的功能也会容易很多。
资料
- https://docs.unrealengine.com/latest/INT/API/index.html 官方API文档,在里面可以预览结构树,而且提供了简单的介绍,比在工程里面去找方便多了,找到目标之后再去看源码会更有针对性,而且不容易迷失。。
- https://docs-origin.unrealengine.com/latest/INT/Gameplay/Framework/index.html 这里面主要记录了设计的理解,即设计者想让开发者在这个模块做什么
- https://leaf-eater.github.io/2017/09/03/Unreal新手笔记(一)-从蓝图到C/ hmmm…传说中的上一篇文章