查看原文
其他

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

Unity Unity官方平台 2022-05-07

随着游戏开发技术在不断进步,3D游戏变得越来越普遍。但在多年前,还没有对3D元素的支持,开发3D游戏非常困难,当时的解决方案是利用由2D元素组成的等距视图。

 

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


最热门的等距游戏

如果你不了解什么是等距游戏,下面我们将盘点出的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,制作等距视图游戏变得非常简单又省时。该工具功能强大,易于理解,这些优点使它在其它等距工具中脱颖而出。


你学会了吗?赶紧动手来制作等距游戏吧。更多Unity教程,尽在Unity官方中文论坛(UnityChina.cn)

 

推荐阅读


官方活动

Unity趣味问答,赢取新年礼物

2月16日18点前,参加Unity趣味问答,赢取限量Unity纪念礼物。了解详情,请点击此处。


Asset Store新春特惠

2月23日前,Asset Store资源商店将进行新春特惠活动,全场资源9折,更有顶级精品资源7折,赶紧选购吧。了解详情,请点击此处


Unite Shanghai 2019

5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。


购票请访问:Unite2019.csdn.net


点击“阅读原文”访问Unity官方中文论坛

您可能也对以下帖子感兴趣

什么是Unity?解锁Unity引擎技术,掌握行业领域趋势!
选择一个工具,还是选择一个生态——Unity如何为中国创新者装配“新引擎”
Godot,一个超级实用的c++库
Unity 中国生态伙伴公开招募,携手打造优质 3D 应用
游戏开发指南:使用 UOS C# 云函数快速构建与部署服务端逻辑实战教学

文章有问题?点此查看未经处理的缓存