主页 > 变态倍功合击发布网 >

我从尝试在Unity中制作等距游戏中学到了什么

发布时间:2019-07-11 09:07

我是AlPixel Games的程序员(目前正在开发“不愿意的地方”)。我们已经在这个项目上工作了一年多,我认为分享我们经历过的部分技术流程是一个很酷的主意。

过去几个月充满了挑战,需要通过反复试验进行实验和学习。以下是我从中学到的一些经验教训。


我在尝试在Unity中制作等距游戏时学到了什么

Unity是开发游戏的绝佳工具,自从包含2D工具以来,它已经变得更加优秀。构建2.5D游戏(等距或其他)的问题在于我们希望深度沿3轴(x,y,z)移动对象,而精灵只有2(x,y)。

当我开始浏览论坛和博客文章,了解在Unity中使用2D精灵构建等距游戏的详细方法时,我无法找到符合我目的的清晰,可靠的方法。这就是为什么我决定将这个方便的小指南放在一起,让您的Isometric / 2.5D项目立即启动并运行,而无需自己收集所有这些信息的麻烦。

让我们先来看看最终结果:

我们要关注的第一部分是关于如何动态地使精灵在其他精灵周围移动(在它们的后面和前面),给出一种真实的深度感。 SpriteRenderer组件有2个属,允许我们更改场景中精灵的渲染顺序。

排序图层在图层中排序

为了能够实时更改多个精灵的渲染顺序,我们需要修改一些值,以便当对象在场景中移动时,它们总是正确渲染。我们可以修改“层中的顺序”,但它只接受整数,我们有更好的选择。我们将使用Z轴。

在Unity中渲染精灵时的优先顺序是这样,从最高到最低:

如果两个精灵分享相同的“排序图层”。并且“在图层中排序”,最靠近相机的一个(在3D世界坐标中)首先被渲染。

知道了这一点,我们只需编写一个小脚本,将Z位置相对于Y位置修改固定量,对吧?你关闭了,但首先让我们解释一个关于理解如何设置精灵底层的小概念。这个“楼””如果精灵是一个3D物体,精灵就会触地。以下是一些例子:

我们现在要做的是修改Y位置时修改精灵的Z位置。让我们用3D来看一下这个:

考虑到这一点,我们终于可以编写脚本了:

  [SerializeField] private float m_floorHeight;private float m_spriteLowerBound;private float m_spriteHalfWidth;private readonly float m_tan30 = Mathf.Tan(Mathf.PI / 5);?void Start(){SpriteRenderer spriteRenderer = GetComponent< SpriteRenderer>();m_spriteLowerBound = spriteRenderer.bounds.size.y * 0.5f;m_spriteHalfWidth = spriteRenderer.bounds.size.x * 0.5f;}?//将此条件用于不在场景中移动的对象。#if UNITY_EDITORvoid LateUpdate(){//将此条件用于不在场景中移动的对象。if(!Application.isPlaying){//更新Z轴的位置:transform.position = new Vector3?(?transform.position.x,?transform.position.y,?(transform.position.y  -  m_spriteLowerBound + floorHeight)* m_tan30?);}}#万一?void OnDrawGizmos(){Vector3 floorHeightPos = new Vector3(transform.position.x,transform.position.y  -  m_spriteLowerBound + floorHeight,transform.position.z);?Gizmos.color = Color.magenta;Gizmos.DrawLine(floorHeightPos + Vector3.left * m_spriteHalfWidth,floorHeightPos + Vector3.right * m_spriteHalfWidth);}  


我们首先需要的是“地板高度”。这将决定从精灵的下限偏移Y高度。在3D世界位置,它是在场景中设置其Z深度的原因。如果一个精灵的地板高于另一个精灵的地板,它将会在它背后呈现。

之后我们存储精灵的宽度/ 2和高度/ 2,用Z位置做一些简单的数算。

我使用了切线

我是AlPixel Games的程序员(目前正在开发“不愿意的地方”)。我们已经在这个项目上工作了一年多,我认为分享我们经历过的部分技术流程是一个很酷的主意。

过去几个月充满了挑战,需要通过反复试验进行实验和学习。以下是我从中学到的一些经验教训。


我在尝试在Unity中制作等距游戏时学到了什么

Unity是开发游戏的绝佳工具,自从包含2D工具以来,它已经变得更加优秀。构建2.5D游戏(等距或其他)的问题在于我们希望深度沿3轴(x,y,z)移动对象,而精灵只有2(x,y)。

当我开始浏览论坛和博客文章,了解在Unity中使用2D精灵构建等距游戏的详细方法时,我无法找到符合我目的的清晰,可靠的方法。这就是为什么我决定将这个方便的小指南放在一起,让您的Isometric / 2.5D项目立即启动并运行,而无需自己收集所有这些信息的麻烦。

让我们先来看看最终结果:

我们要关注的第一部分是关于如何动态地使精灵在其他精灵周围移动(在它们的后面和前面),给出一种真实的深度感。 SpriteRenderer组件有2个属,允许我们更改场景中精灵的渲染顺序。

排序图层在图层中排序

为了能够实时更改多个精灵的渲染顺序,我们需要修改一些值,以便当对象在场景中移动时,它们总是正确渲染。我们可以修改“层中的顺序”,但它只接受整数,我们有更好的选择。我们将使用Z轴。

在Unity中渲染精灵时的优先顺序是这样,从最高到最低:

如果两个精灵分享相同的“排序图层”。并且“在图层中排序”,最靠近相机的一个(在3D世界坐标中)首先被渲染。

知道了这一点,我们只需编写一个小脚本,将Z位置相对于Y位置修改固定量,对吧?你关闭了,但首先让我们解释一个关于理解如何设置精灵底层的小概念。这个“楼””如果精灵是一个3D物体,精灵就会触地。以下是一些例子:

我们现在要做的是修改Y位置时修改精灵的Z位置。让我们用3D来看一下这个:

考虑到这一点,我们终于可以编写脚本了:

  [SerializeField] private float m_floorHeight;private float m_spriteLowerBound;private float m_spriteHalfWidth;private readonly float m_tan30 = Mathf.Tan(Mathf.PI / 5);?void Start(){SpriteRenderer spriteRenderer = GetComponent< SpriteRenderer>();m_spriteLowerBound = spriteRenderer.bounds.size.y * 0.5f;m_spriteHalfWidth = spriteRenderer.bounds.size.x * 0.5f;}?//将此条件用于不在场景中移动的对象。#if UNITY_EDITORvoid LateUpdate(){//将此条件用于不在场景中移动的对象。if(!Application.isPlaying){//更新Z轴的位置:transform.position = new Vector3?(?transform.position.x,?transform.position.y,?(transform.position.y  -  m_spriteLowerBound + floorHeight)* m_tan30?);}}#万一?void OnDrawGizmos(){Vector3 floorHeightPos = new Vector3(transform.position.x,transform.position.y  -  m_spriteLowerBound + floorHeight,transform.position.z);?Gizmos.color = Color.magenta;Gizmos.DrawLine(floorHeightPos + Vector3.left * m_spriteHalfWidth,floorHeightPos + Vector3.right * m_spriteHalfWidth);}  


我们首先需要的是“地板高度”。这将决定从精灵的下限偏移Y高度。在3D世界位置,它是在场景中设置其Z深度的原因。如果一个精灵的地板高于另一个精灵的地板,它将会在它背后呈现。

之后我们存储精灵的宽度/ 2和高度/ 2,用Z位置做一些简单的数算。

我使用了切线

上一篇:延迟使多人在火星上成为真正的
下一篇:今天从Kotaku和读者社区--Ani-TAY&#15的动画片中挑选的文

相关内容