上文我们说到在Actor层次,UE用Controller来充当APawn的逻辑控制者,也有了可以接受玩家输入的PlayerController,和能自行行动的AIController。Actor的逻辑编写介绍完了,那么本篇,我们继续爬升,对于由Actors组成的Level这一层次,UE又是怎么控制的呢?
对Level记不太清楚的朋友,可以翻回去查看“GamePlay架构(二)Level和World”的讲述,简单概括就是World是由一个PersisitentLevel和一些subLevels组成的,PersisitentLevel切换了,相应的World也会切换。所以本文的关注点是在这么一个对象层次结构下,UE是怎么设计的,我们又能做些什么。
GameMode
Level,在游戏里的概念里,就是关卡的意思。同时作为游戏的玩家和开发者,我们总是会非常经常的提起关卡,但是关卡具体又是个什么定义呢?游戏里的哪些部分可以算是一个关卡?简单的我们都知道有《愤怒的小鸟》或《植物大战僵尸》的关卡,复杂的有大型FPS游戏里的关卡,而对于更大型的《暗黑3》或者大型无缝地图RPG游戏《巫师3》,甚至是号称超级广阔宇宙《无人深空》,我们能直接了当的说出哪部分是关卡吗?游戏行业发展如今,为了更好的组织游戏逻辑和内容资源,也发展出了一些概念来更好的理解和阐述,虽然叫法不同,不过含义理念都是相通的。比如,Cocos2dx会认为游戏就是由不同的Scene切换组成的,每个Scene又由Layer组成;Unity也认为游戏就是一个个Scene;而UE的视角的是,游戏是由一个个World组成的,World又是由Level组成的。这些概念有什么不同?
让我们从游戏本身的机制上分析:
- 游戏或玩家的节奏,游戏可以分成一个个阶段,马里奥里的关卡就是一个阶段,而RPG游戏的一个大地图也是一个阶段。一个游戏也可能只有一个阶段,比如一直在宇宙里漫游的游戏。通常一个阶段结束后,会有一个结算,阶段之间,玩家也能明显感觉到切换感。
- 游戏的机制,有时候即使是同样的场景,玩家却也能感觉就像在玩两个不同的游戏,比如MOBA里的同一张地图上的各种不同挑战模式。
- 游戏的资源划分,有时候也能遇见同一个玩法应用在不同的场景上,比如赛车游戏的不同跑道。有时候也会在游戏的大地图里从酷热的沙漠到寒冷的极地。游戏开发中也总是倾向于给游戏用到的资源划分成组的进行载入和释放。
通过以上的分析,也和以前的一贯思路一样,我们发现在思考“关卡”这件事情上,也是要保持头脑清晰的分清“表示”和“逻辑”。玩法就是“逻辑”,场景就是“表示”。所以我们如果以逻辑来划分游戏,得到的就是一个个World的概念;如果以表示来划分,得到就是一个个Level。一场游戏中,玩法再复杂但也只有一个,场景却可以无限大,所以可以有很多个表示拼接组装,因此是World包含Level,而不是反过来。现在回过头来回想一下Cocos2dx和Unity的世界观,它们的概念还只是在表示层,在游戏实例和关卡之间少了一个更高级的逻辑概念。
因此UE的世界观是,World更多是逻辑的概念,而Level是资源场景表示。以《巫师3》为例,有好几个国家之间通过传送切换,国家内大地图无缝漫游,显然我们知道不可能把一个国家的所有资源都加载进内存,因此在UE里,一个国家就是许多个Level拼接的,而一个国家就是一个World,它们可以有不同的模式玩法。但毕竟AAA游戏很少,通常的,我们的游戏比较简单的用一个Level就够了,否则这个场景表示的概念就应该叫Area更合适了,也因此通常的这里的Level也常常对应游戏里玩家面对的"关卡",也因此UE里Level的Settings叫做WorldSettings了。
厘清了这些概念了之后,我们就知道,当我们在谈Level的业务逻辑控制的时候,我们实际上谈的是World的业务逻辑。按照UE的设计理念和经过Controller的经历,我想我也不用多解释了从Actor再派生出一个WorldController的方式了,可以直接的享受Actor已经提供的一切福利。一个World的Controller想不出有什么需要展示渲染的,因此可以直接从AInfo派生吧。哦,WorldController是我瞎编的,在UE3里它叫做GameInfo,到了UE4它改名为了GameMode。笼统的讲,一个World就是一个Game,把玩法叫做Mode,我们应该也能接受吧。那我们来看看它: