详解上帝视角游戏(部落冲突或帝国时代系列)的快速创建
发表于2017-07-14

Ultimate Isometric Toolkit
Asset Store
Easy Isometric Sorting
Asset Store
Isometric 2.5D Toolset
Asset Store
这种排序法在以前做传奇传世的时候还是经常见到的,属于2d排序的常用做法,某种程度上3d引擎是更容易实现的,不过因为2d引擎的思路和3d的不同,实现起来会是两套不同的体系,导致说你的三维角色没法在2d空间里面正确的遮挡(spine之类当然没问题,不过那个也是通过sort 实现,而不是深度)
我推荐的插件里面的第一和最后一个,我记得是将sprite自动在3d空间内做深度散布的,非常好解决2d引擎在3d空间里面的解释问题。
Asset Store

Asset Store

Asset Store

我推荐的插件里面的第一和最后一个,我记得是将sprite自动在3d空间内做深度散布的,非常好解决2d引擎在3d空间里面的解释问题。
细说天神/上帝视角游戏(部落冲突或帝国时代系列)的快速创建
译者注:1.有很多出色的图灵社区学者和译员对Isometric Games进行了讨论,将其翻译成等轴测视图/等轴游戏,但基于自身的体验和本地化工作的考虑,我翻译其为上帝视角,附图灵社区翻译:http://www.ituring.com.cn/article/788
2.我很喜欢刨根问底的同学,如果您对等轴测视图有所疑问,请点击视频链接,以方便理解:http://v.youku.com/v_show/id_XMTQ2NDUwNDM2.html?from=s1.8-1-1.2
3.欢迎理性提问,其他与主题无关的问题可能忽略回答,谢谢合作。

目录:
1.什么是上帝视角?
2.在unity中开发上帝视角游戏的注意事项
3.如何在unity中开发上帝视角游戏
4.上帝视角游戏开发工具总览
5.上帝视角游戏案例
6. 创建地图层级
7.深入分析LevelGenerator
8.在当前地图移动物体
9.精灵管理
10.在上帝视角地图进行物体转换
11其他上帝视角游戏开发工具包
目标: 电脑硬件的推陈出新,促使3D游戏更加蓬勃的发展。在那时由于当没有支持3D元素的硬件,开发3D游戏相当难,但聪明的前人也是在那时提出了一个绝妙的解决方案,上帝视角。
最受欢迎的前10名上帝视角游戏
Clash Of Clans 部落冲突
Plants vsZombies 植物大战僵尸
Hay Day 卡通农场
Boom Beach 海岛奇兵
Kingdom Rush 皇家守卫军
Monument Valley 纪念碑谷
RollerCoasterTycoon 过山车大亨
Castle Defense 城堡防御
Crossy Road 天天过马路
Village City 乡村城市
从这里开始我们将探讨:
1. 什么是上帝视角?
简单来说,上帝视角无非就是将三维物体二维化。这种类型的游戏通常都是通过最简单又有效的瓦片地图进行铺盖实现的。它模拟类似于三维的世界空间,所以有时候又被称做伪3D或者2.5的视角游戏。早期最具有代表的游戏是Q*bert,它开发于1982年,是世界上第一款上帝视角游戏,现在的COC(部落冲突)和AOE(帝国时代)都属于它的子孙辈。
2.在unity中开发上帝视角游戏的注意事项
您可能在unity中开发上帝视角游戏中遭遇到以下的问题:首先难以对三维游戏视角下的各瓦片地图的位置进行定位,并且处理游戏物体在世界坐标和游戏坐标的映射和定位又非常复杂和耗时,更令人恐怖的是,Unity没有相应的工具和控件直接或间接支持上帝视角。所以直到目前为止,大多数的第三方工具/插件,都没有足够的强大功能或足够的优化,可顺利无忧地开发该类型游戏。再者,对于各瓦片地图的实时渲染也是非常损耗性能的,皆因其没有插件/工具优化到极致,导致加载时需要耗费非常多的时间。
3.所以话题又回到了如何正确地借助插件开发上帝视角游戏?
我在unity的资源商城找了很多相关的插件,印象最深的就是一款叫做UltimateIsometric Toolkit。
4.让我们对UltimateIsometric Toolkit进行简单的剖析
众所周知,Unity是一款非常棒的3D游戏开发引擎当然,它所存在的问题也非常严重,渲染3D游戏物体时非常占用内存!!!当您需要非常多的功夫来解决非常简单的问题,如排序,精灵图片切割和调动作,上帝视角游戏就不存在这个问题,并且会非常节约时间,因为它不需要对3D模型减面,优化纹理大小和添加各种刚体等。
由于无需渲染3D游戏物体,并且通过引入精灵链表(即每种精灵仅保存一份预设)的方式,大大节省了性能。再加上通过该插件对瓦块位置和游戏物体的定位,即可低损耗地解决繁杂的排序和运算量的问题。让我们用一个非常简单的例子来加深理解这个工具包。
5.案例精讲
为便于理解,该案例分为以下步骤:
为该游戏创建简单地图载体
在该载体上放置游戏物体
上帝视角空间的游戏物体变化
上帝视角空间的碰撞检测
精灵管理
工具包的其他功能
说了那么多,还是让我们动手实践一下吧。
6.创建简单层级地图
以下为创建简单层级地图的关键步骤:
创建一个2D的unity项目
把该插件导入你的新建项目中(点击这里下载该插件)
完成上述步骤后,开始创建我们瓦片地图的第一个瓦片。
创建一个瓦片然后制作成预设,该预设将用于填充层级地图。(你也可以使用工具包里的纹理图找到瓦片进行创建)
给该预设添加两个脚本,IsoObject和IsoCollider。
然后,创建一个空的游戏物体,命名其为LevelGenerator。
给新创建的游戏物体添加LevelGenerator.cs脚本,该脚本可以在 UltimateIsometric Toolkit > Code > IsometricTools > Other.找到。
7.深入分析LevelGenerator
Let us nowunderstand LevelGenerator:让我们对LevelGenerator进行分析
Size属性表示瓦片地图的大小,具体可看示意图。
可参考下图加深对瓦片地图在游戏场景的摆放。在LevelGenerator属性窗口,该小瓦片的大小设置为20,20,1,分别对应x,y,z.


Size属性描述被放置到瓦片地图上的瓦片的大小。它用于衡量小瓦片相对于在瓦片地图的自身位置的天神位置。
Seed用于定制随机数的种子,产生随机瓦片。
Roughness用于描述瓦片的分散状态。该值越大,瓦片所摆放的状态越分散。
振幅表示在瓦片地图中的瓦片层数
Prefab即您创建并添加了IsoObject脚本的瓦片。
设置上述属性的参数如下图所示:

需要注意的是,你需要为prefab属性分配一个预设引用。然后就创建一个如下的平面:

如果您仔细观察每个已经创建的瓦片,在它们身上都挂靠有2个脚本。
IsoObject:
该类可将游戏物体转变成一个倾斜视角的菱形物体(即上帝视角物体),并可对瓦片的位置和大小进行控制。所有在游戏场景里的物体都有transform组件,上帝视角游戏也一样,更不必说空的游戏物体。
IsoCollider:
添加该脚本后能自动为游戏物体添加网格碰撞器,用于碰撞检测。所以在创建了游戏预设时别忘了添加IsoCollider 和IsoObject 脚本。
使用该插件内置的瓦片,我们开始为瓦片添加下边界。以下截图就是我使用内置的瓦片所搭建,它的制作流程与搭建地图相似。模型参考如下:

提示:您也可以手动创建边界,但是实时渲染时会比较耗时。所以,根据自己项目的实际需求,我将对该插件的GenericGridMap脚本进行修改。然后现在可实现手动添加自己所需物件。只需随意拖拉插件的物件到地图上即可。
我使用了插件里的仙人掌,树和车子的预设模型来构建场景,该场景如下图所示:

看,是不是非常简单地创建一个上帝视角游戏的地图。使用该插件,我们无需去考虑游戏物体排序问题,仅需关注游戏核心功能的开发。
8.使用代码控制游戏物体的移动
在这个小节中,我们自定义一个脚本用于控制游戏物体的变换和移动。添加以下代码到一个车子的预设。
CarControllerScript:
public classCarController : MonoBehaviour { public float speed = 10; public SpriteRenderer spriteRenderer; public Sprite carSpriteNorth; public Sprite carSpriteSouth; public Sprite carSpriteWest; public Sprite carSpriteEast; public GameObject explisionPrefeb; private IsoDirectioncurrentDirection; private Vector3targetPosition; void Start() { currentDirection = IsoDirection.North; spriteRenderer.sprite = carSpriteNorth; } void Update() { if (!GameManager.Instance.isGameRunning) return ; //North if (Input.GetKeyDown(KeyCode.UpArrow)) { currentDirection =IsoDirection.North; spriteRenderer.sprite =carSpriteNorth; } //South else if (Input.GetKeyDown(KeyCode.DownArrow)) { currentDirection =IsoDirection.South; spriteRenderer.sprite =carSpriteSouth; } //West else if (Input.GetKeyDown(KeyCode.LeftArrow)) { currentDirection =IsoDirection.West; spriteRenderer.sprite =carSpriteWest; } //East else if (Input.GetKeyDown(KeyCode.RightArrow)) { currentDirection =IsoDirection.East; spriteRenderer.sprite =carSpriteEast; } targetPosition =Isometric.vectorToIsoDirection (currentDirection); transform.Translate (targetPosition *Time.deltaTime * speed); } void OnCollisionEnter(Collision other) { if (other.gameObject.CompareTag( "Finish" )&& GameManager.Instance.isGameRunning) { spriteRenderer.sprite = null ; Instantiate(explisionPrefeb,transform.position, transform.rotation); GameManager.Instance.OnGameOver(); } } } |
9.精灵管理
当添加了上述代码到脚本中,即完成了为游戏物体添加方向的图标,现在小轿车的每个方向都有相应的指示图标用于指示方向。
10.变换
很明显,该类型游戏的物体变换与普通游戏的基本变换不一样。
在开始进行天神物体变换时,我们首先需要游戏物体相对于地图的方向进行运算。所以,我们会调用Isometric. vectorToIsoDirection (IsoDirection)进行计算,然后判定移动的方向(东南西北)。这个函数返回在等距映射isodirection的投影矢量。该投影矢量描述的是物体在游戏空间中的的实际位置。因此,在获得了目标位置,我们就可传递该参数给unity变换组件进行变换运算。
以上就是我们使用这个工具做游戏的一些描述。上述demo我用了1个多小时来制作,毕竟我是第一次接触到这个插件,所以必须先阅读下其文档。当熟练之后,我相信这个时间可以缩减到10来分钟。
11.其他的优点简述
该插件的优点还包括以下几点:
用非常少的开销同时处理成千上万的精灵
空间可视化简化了unity工作流程
全平台支持
实行运算
有各种用例的控制器脚本
详细的说明文档
版本容量小功能强大
非常人性的售后服务(email,教程和论坛)
游戏物体预设化
输入支持鼠标和触摸
结论:
使用该插件能非常简单和快捷地创建一个上帝视角的游戏。由于该插件功能强大并容易上手,所以使得它在相类似的插件中脱颖而出。