我们来学习如何制作类似《部落冲突》的一个简单等距游戏。下面是学习本文后,将要实现的效果。

最热门的等距游戏

如果你不了解什么是等距游戏,下面我们将盘点出的Top 10最热门等距游戏。

  1. 部落冲突

  2. 植物大战僵尸

  3. 卡通农场

  4. 海岛奇兵

  5. 皇家守卫军

  6. 纪念碑谷

  7. 过山车大亨

  8. 城堡防御

  9. 天天过马路

  10. 乡村城市

相信对于榜单中的等距游戏,你一定有所耳闻,或者沉迷其中感受过等距游戏的魅力。

学习准备

1

了解等距视图

什么是等距视图呢?简单来说,等距视图是为2D游戏实现3D错觉效果。

等距视图可以通过基于平铺的方法来制作,这也是最常见有效的方法之一。等距视图能实现3D错觉效果,有时它也被称为伪3D或2.5D。

1982年出品的《Q*bert》是第一批使用等距视图的游戏。如今《部落冲突》和《帝国时代》等大型游戏也使用了这种投射方法。

2

Unity中开发等距游戏的问题

在Unity中开发等距游戏时,我们可能会遇到以下问题:

  • Unity计算定位瓦片的方法会使游戏的3D视图制作变复杂。

  • 将世界空间或游戏空间的对象实际位置映射到等距视图的本地位置会很复杂,而且非常耗时。

  • Unity没有任何直接处理等距投射的工具或支持。

  • 目前大多数第三方工具在开发流畅理想的等距游戏方面不够强大,也没有足够的优化效果。

  • 这类地图生成的计算量很大,目前没有工具能以优化的速度加载等距地图。

3

使用Ultimate Isometric Toolkit开发等距游戏

在研究解决问题时,我们在Asset Store资源商店尝试了大量工具,最终选择的是Ultimate Isometric Toolkit。

作为3D引擎,Unity在开发3D游戏时非常强大,但是Unity会产生制作和渲染3D对象的性能开销。对于等距游戏,我们需要大量额外代码来解决相关问题,例如:排序,插入精灵和持续移动。

等距风格3D游戏的优点很明显,我们能够节省大量时间,不必为3D对象进行建模,制作纹理和绑定等工作。我们完全去除了渲染3D场景的性能开销,通过使用精灵图集节省了大量相关3D资产制作所需投入资金。

实现3D错觉的定位瓦片计算,以及把对象实际位置映射到等距视图位置的工作,都可以由Ultimate Isometric Toolkit完成。Ultimate Isometric Toolkit也很好地解决了排序问题以及制作等距视图的其它算法,使用的性能开销很低。

Ultimate Isometric Toolkit下载地址:

https://assetstore.unity.com/packages/templates/systems/ultimate-isometric-toolkit-33032

4

学习目标

下面我们将通过简单的示例来学习Ultimate Isometric Toolkit的使用。我们将了解以下内容:

  • 在等距视图创建简单的基础地面

  • 在基础地面上放置对象

  • 在等距空间平移对象

  • 在等距空间实现碰撞检测

  • 精灵管理

  • 了解Ultimate Isometric Toolkit的功能

创建等距游戏

1

创建简单的等距关卡

我们在Unity中新创建一个2D项目,并在项目中导入Ultimate Isometric Toolkit资源包。

首先,我们创建瓦片地图的基础地面,并为瓦片创建预制件,它会用来制作基础地面,你可以使用Ultimate Isometric Toolkit的任意精灵块。我们把IsoObject脚本和IsoCollider脚本添加到预制件。

在场景新创建一个空白游戏对象并命名为LevelGenerator,把LevelGenerator.cs脚本添加到新建游戏对象。你可以在Ultimate Isometric Toolkit > Code > IsometricTools > Other下找到LevelGenerator.cs脚本。

2

了解LevelGenerator对象

下面让我们来了解LevelGenerator。

Size表示下图中瓦片地图的大小。在LevelGenerator脚本中,瓦片在场景中的放置方法如下图所示,图中的基础地面大小为(x, y, z):(20, 20, 1)。

Tile Size表示放到地图的每个瓦片的大小,它会相对于IsoObject在瓦片地图的位置,调整IsoObject的等距位置。Seed用于创建随机地图。

Ruffness表示瓦片放置的粗糙程度。粗糙度越大,瓦片会更为分散。Amplitude表示地图中将使用的瓦片图层数量。Prefab会给IsoObject对象提供我们创建的瓦片预制件引用。

请按下图设置这些属性。(可点击大图查看)

请注意,我们必须在Prefab属性中设置引用,这样会创建如下图所示的平面。

每个瓦片创建后,我们会得到二个附加的脚本:

  • IsoObject:使游戏对象变成等距对象的基类,它会表示瓦片的位置和大小。场景中所有对象都有Transform组件,它是等距游戏的一部分。即使是空白游戏对象,也应该有附带该组件。

  • IsoCollider:该脚本通过自动添加网格碰撞体,在等距游戏对象中实现碰撞检测。

在给地图创建预制件时,不要忘记添加IsoCollider脚本和IsoObject 脚本。

现在选中其它预制件,在地图边缘创建边界。我们制作了不同的预制件来创建边界,方法类似制作地面的预制件,如下图所示。

你也可以手动制作边界,但这样做耗时很久。在这个示例中,我们修改了Ultimate Isometric Toolkit的GenericGridMap脚本来制作边界。

现在根据需要手动添加对象。把工具提供的预制件手动拖到基础地面上。我们使用了部分图集的预制件,包括仙人掌,树木和汽车,创建出下图的场景。

这样一个等距地图就创建完成了,使用工具制作等距地图的过程如此轻松,我们不必担心排序算法,该工具会处理好所有内容,使我们能够专注于游戏的核心功能。

3

在当前地图移动对象

现在我们创建一个脚本CarController,用于实现对象在等距地图上的移动过程。并将脚本附加到汽车预制件上。

CarController脚本代码如下所示。

public class CarController : MonoBehaviour
{
   public float speed = 10;
   public SpriteRenderer spriteRenderer;
   public Sprite carSpriteNorth;
   public Sprite carSpriteSouth;
   public Sprite carSpriteWest;
   public Sprite carSpriteEast;
   public GameObject explisionPrefeb;
   private IsoDirection currentDirection;
   private Vector3 targetPosition;

void Start()
   {
       currentDirection = IsoDirection.North;
       spriteRenderer.sprite = carSpriteNorth;
   }

void Update()
   {
       if (!GameManager.Instance.isGameRunning)
           return;

//北
       if (Input.GetKeyDown(KeyCode.UpArrow))
       {
           currentDirection = IsoDirection.North;
           spriteRenderer.sprite = carSpriteNorth;
       }
       //南
       else if (Input.GetKeyDown(KeyCode.DownArrow))
       {
           currentDirection = IsoDirection.South;
           spriteRenderer.sprite = carSpriteSouth;
       }
       //西
       else if (Input.GetKeyDown(KeyCode.LeftArrow))
       {
           currentDirection = IsoDirection.West;
           spriteRenderer.sprite = carSpriteWest;
       }
       //东
       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();
       }
   }
}

4

精灵管理

如CarController脚本的代码所示,我们有四个不同精灵用在四个方向。因此,汽车会在每个方向上使用单独的精灵。

5

在等距地图上平移

等距对象的平移过程和普通变换过程的操作不同。对于等距平移,我们必须相对于等距地图来计算方向。为此我们会使用Isometric类函数。

Isometric. vectorToIsoDirection (IsoDirection)

我们在此使用该函数以任一IsoDirection方向移动汽车,即东南西北四个方向。该函数会返回等距地图上的IsoDirection投射向量,投射向量表示汽车在Unity游戏空间的实际位置。

在获得移动汽车的目标位置后,我们可以把目标位置传给Unity中Transform类的Translate方法。

这就是我们使用Ultimate Isometric Toolkit这个强大工具制作简单等距游戏的方法。

6

Ultimate Isometric Toolkit的优点

下面是一些Ultimate Isometric Toolkit的优点:

  • 一次处理上千个精灵,仅需很少性能开销

  • 提供简化Unity工作流程的编辑器工具

  • 支持Unity提供的所有平台

  • 提供运行时关卡生成功能

  • 提供适用于大量用例的控制器脚本

  • 详实的文档

  • 提供Lite版和Pro版

  • 通过Email、视频、Unity论坛等方式提供用户支持

  • 所有内容都经过排序并制作了预制件

  • 支持鼠标和触屏输入

结语

通过使用Ultimate Isometric Toolkit,制作等距视图游戏变得非常简单又省时。该工具功能强大,易于理解,这些优点使它在其它等距工具中脱颖而出。

快速学习制作类似《部落冲突》的等距游戏相关推荐

  1. vue中集合取第一个_快速学习Vue框架(知识点集合)

    学习Vue的小伙伴速度看过来,快速学习Vue框架知识点集合贴来啦.建议收藏,尤其基础并不是很扎实的同学,本篇集合贴就是你日后工作的参考手册. 基础知识: ·vue的生命周期:beforeCreate/ ...

  2. Ignite 数据网格快速学习(一)

    PS:所有的代码使用的是Ignite2.0 #1.数据的基本存储操作 public static void main(String[] args) {//Ignition.start(...)启动一个 ...

  3. 使用jQuery 快速高效制作 网页特效

      使用jQuery 快速高效制作 网页特效                                第一章:JavaScript基础 DOM:document object model 文档对 ...

  4. 部落冲突上链,币安领投Heroes of Mavia带来全新模式

    概述 1.基本情况 1.1项目简介 1.2基本信息 2.项目详情 2.1团队 2.2资金 2.3产品 3.发展 3.1 Roadmap 3.2现状 4.经济模型 4.1供给 4.2 持币地址分析 4. ...

  5. 《部落冲突》的分析与探讨

    目录: 一.付费 二.战斗 三.引导 四.进攻成本 五.愚见 六.疑问 一.付费 1.充值档位 ①标准的付费价位. ②30元刚好为购买3号工人的钱,符合刚入门玩家的心理预期.第二个点和第三个点比购买4 ...

  6. “十步学习法”,如何快速掌握一门技能,如何快速学习新技术

    文章目录 前言: 1. 十步学习法总览 2. 十步学习法:前期调研(第1-6步:只做一次) 第1步:了解全局 第2步:确定范围 第3步:定义目标 第4步:寻找资源 第5步:创建学习计划 第6步:筛选资 ...

  7. ElasticSearch快速学习---30分钟入门ElasticSearch

    ElasticSearch快速学习 ElasticSearch原理,30分钟入门ElasticSearch 目录 1 解析es的分布式架构 2 分片和副本机制  3 单节点环境下创建索引分析 4 两个 ...

  8. 怎样快速学习html5,如何快速学习HTML5?带你了解HTML5学什么?

    今天小编要为大家分享的文章是关于如何快速学习HTML5?HTML5主要学些什么的文章.近年来前端开发非常热门,前端开发工程师也很稀缺,于是很多人将其视为高薪行业的代名词.HTML5前端开发工程师被称作 ...

  9. 有 OC 经验的程序员快速学习 Swift 语法

    前言 苹果官方推出 Swift 语言至今,已经过了 7 年之久,Swift 也更新到了 5.5 版本, 它的语法和 API 也趋向于稳定.最近闲来无事,决定开始研究这 iOS 开发编程语言的语法.因为 ...

最新文章

  1. C#线程间操作无效: 从不是创建控件 XX 的线程访问它
  2. Skype for Business Server 2015-08-反向代理-发布-统一沟通
  3. 【 Verilog HDL 】case, casez, casex 之干货总结
  4. LYNC显示用户位置的相关配置
  5. 软件项目管理0710:招标文件准备【求助】
  6. js数组的声明与应用
  7. 将数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔
  8. 【独家】衣服上的铁锈去除简易方法
  9. java的Random类详解
  10. zookeeper的acl权限控制_Zookeeper 权限控制 ACL介绍
  11. C++中引用()基础认识
  12. c语言打开pdf失败,c语言错误种类总结.pdf
  13. javascript 滚动+停留 代码
  14. win10打开蓝牙_win10动态锁,只要你离电脑远一点,电脑就自动锁定
  15. 串行加法器 并行加法器 超前进位加法器
  16. android 修改ip的scope的作用,Android Netd分析
  17. Unity 2D横版闯关游戏 (JUNGLE RULES)
  18. 超级详细VM16虚拟机安装CentOS 6.8创建虚拟机
  19. 学习Java应该关注哪些网站?
  20. python dataframe index_Python将DataFrame的某一列作为index的方法

热门文章

  1. js中关于邮箱号、手机号。。等的正则验证模板
  2. 社交系统/社群系统“ThinkSNS+”H5及PC端即将内测!一起来“找茬”
  3. 学术论文查重经验分享
  4. ROC,AUC,Precision,Recall,F1的介绍与计算
  5. 【大数据应用开发】大数据的概念
  6. CAN总线步进伺服一体机闭环步进电机
  7. Tableau退出中国,国产自主BI选型升级技术有何亮点?
  8. 为何数千名程序员在4月20日集体消失?原来是去参加这个
  9. 伪造老板声音要求转账,被AI骗走173万!
  10. 多线程环境中lock.trylock方法争抢锁