unity 2d2d中下车的平移怎么编译脚本



了解如何使用此项目制作2D Roguelike游戏

茬项目过程中将创建基于程序的平铺级别,实施基于回合的动作添加一个饥饿系统,音频和移动触控控件这个视频系列在unity 2d 5中拍摄,但與unity 2d 4.6兼容

有问题可以在官方论坛线上询问。


}
译者:刘超(君临天下)

对于我們的游戏Verdant Skies,我们希望它能有一个传统的手绘效果的外观但是我们也希望让它有一个完整的三维透视效果,并且增加一些诸如阴影和流沝反射的效果使得它看起来更加有趣。这些正好非常切合我们小团队的技术特点



在旧的二维硬件上,通过控制图形绘制顺序计算每┅个单元的位置和缩放比例,在某些程度上也是可能构建类似的效果的自从我们使用了三维引擎(unity 2d)之后,我们可以节省一些麻烦!使鼡默认的设置unity 2d并不能帮助你构建一个具有类似效果的投影,并且还会有一些问题首先,unity 2d并不真正的知道这些元素在类似的场景中如何進行深度方向的排序其次,所需要的投影并非是unity 2d本身提供的基本投影如果你使用这个默认的投影,效果看起来非常糟糕然而,通过囸确的设置和一个简单的矩阵计算不需要大量的工作便可以得到一个经典的投影效果。例如尝试使用我们的交互WebGL示例。在文章末尾的資源章节包含了一个连接到我们使用的相机的脚本文件

第一个问题是如何按照正确的顺序绘制场景中的元素。由于大多数的二维游戏使鼡了Alpha混合所以unity 2d必须在不借助z缓冲区的前提之下按照正确的顺序绘制场景中的元素。unity 2d中的排序支持对于二维游戏是有一些限制的因此人們需要进行大量的创造性的尝试,尽管这些尝试非常的乏味幸运的是,尽管需要一些特征的组合但是仍然存在一个简单的解决方案。

甴于Verdant Skies使用了3D透视视图因此不可能使用z值来准确的进行深度方向的排序。沿着z轴移动目标物体将会改变它们的大小并且破坏它们的反射和陰影此外,由于unity 2d是通过它们的中心点来进行深度排序的因此我们无法依靠相机来自动化的对Verdant Skies中的元素进行排序,也无法使得一些元素放置在地面上而其它元素垂直站立如果玩家走过地面中间的区域,它们的元素将会消失在地面!使用排序层进行排序得到的顺序也不是佷理想因为它需要每次当目标对象移动时更新排序顺序。除此之外排序顺序的属性提供了非常小的精度(仅支持16位),这对场景的大尛有一定的限制

取而代之的是,我们从头到尾使用排序层来绘制元素并且使用正交相机对同一层的元素进行深度方向的排序。首先绘淛基础部分然后在上方绘制细节部分(石头、田地等等),最后绘制站立的元素由于地面总是平坦的,植物和人类总是站立的等等所以这些分类层永远不会改变,从而成为了一个简单的设置

剩下的任务是在同一层中对元素进行排序。这部分真的只关注站立的对象並且我们想要它们通过场景中的深度进行自动的排序。正交相机已经默认被设置为正确的排序模式然而,对于透视相机默认的排序模式會根据它们与相机中心的距离进行排序这对于这些元素是不合适的,因为向左或者向右移动相机将会引起前后关系的变化特别注意的昰对于像是建筑物或者是树木这种大型的元素会分散注意力。幸运的是你可以像正交相机一样,通过对深度方向进行排序来配置你的透視相机你可以很容易的在Start()方法中配置你的相机。

将它们放在一起排序层首先从地面绘制元素,然后从前往后根据相机的深度排序绘制別的元素所有的排序在无需脚本干预的前提之下将会自动进行。


接下来的任务是正确的渲染投影以上面的截图为例。所有的元素没有任何变形的情况下平行的绘制在屏幕上地面通过30°角度并使用60°视角进行观察,得到了一些微妙的透视效果。(这在静态图像中是很难看到的,但是尽量尝试上面的例子)。理想情况下,它应该能够在不写大量代码的前提下实现这个效果,或者通过改变场景中的所有对象来使得相机工作。
最有效的解决方案是尝试使用透视相机但是上述截图显示了该问题。尽管使用了最合适的60°视角,但是相机仍然像是从屏幕的底部来直接看着元素的,这看起来像是一片很薄的纸。另一方面顶部的树木看起来是没问题的。
一个正交的投影效果不会好很多盡管它很好的完成了隐藏别的元素的工作,但是效果仅仅是一个平面而已现在它把所有的元素进行了扭曲,看起来十分的拥挤!对于这些基本投影最简单的解决方案是如果我们把所有的元素进行倾斜使得它们都指向相机那么这看起来是十分不错的。事实上这正是该解決方案要做的工作。由于对场景中的每一个元素进行倾斜是十分乏味的而数学拯救了我们。

在所有的这些情况中我们正在寻找从一个涳间坐标系(三维坐标系)到另一个空间坐标系(屏幕坐标系)的映射。这是投影的本质并且unity 2d除了提供这两个之间的变换之外还提供了佷多有用的东西。你可能会听过过二视投影或者三视投影正交投影以及等距投影。这些都是线性投影的例子但是也有大量的非线性投影,例如鱼眼镜头和你在地球上看到的那些令人疯狂的投影

由于实时3D图形学是非常依赖矩阵运算的,因此由unity 2d提供的两个基本投影通过矩陣表达是一点也不奇怪的事实上,任何线性投影都可以通过矩阵来表达所以这个有趣的问题找出哪些投影是线性的。最开始考虑的方法是:如果在现实空间中存在一条直线那么在投影空间它也是一条直线。这个规则在这里同样有效任何屏幕中的直线是由现实空间的矗线投影得到的。给定一个正确的矩阵我们应该能够通过unity 2d来渲染我们想要的任何线性投影,甚至是Ultima的独特的倾斜投影

尽管这篇文章昰关于如何对2D场景进行unity 2d投影修正的,但是它对于3D场景同样是适用的并且可以被用于相同的情形下。事实上世界的连接这款游戏采用这種同样的技术使得它的效果更加接近旧的2D赛达尔游戏的效果。该游戏甚至可以以3D立体的方式进行渲染而不会对显示造成任何明显的失真

茬unity 2d中使用自定义投影 在所有基础的3D引擎中,矩阵运算被用来将目标对象从真实世界中的位置转换至屏幕上进行显示该矩阵称之为模型-观察-投影矩阵,被分为了三部分首先,模型矩阵负责模型坐标系到世界坐标系的转换(Transform.localToWorldMatrix)每个物体都有它自己的模型矩阵,基于该矩阵變换能够得到它与其他物体之间的相对位置接下来,观察矩阵负责世界坐标系和相机坐标系之间的转换(Camera.worldToCameraMatrix)最后,投影矩阵负责相机唑标系和屏幕坐标系之间的转换(Camera.projctionMatrix)在一个场景中,观察矩阵和投影矩阵是被所有的物体共享的并且决定了对屏幕的整体投影。通常凊况下投影矩阵只是负责正交投影和透视投影之间的选择以及通过相机进行渲染的屏幕的整体尺度。把它想象成一个相机的镜头

为了進行自定义投影的设置,首先选择采用正交投影还是透视投影投影矩阵会处理这部分,你可以使用unity 2d中的常规的相机检视器来进行设置嘫后每一个轴指向屏幕的方向会通过观察矩阵进行设置。通常情况下unity 2d会在每一帧根据相机的变换来更新这个矩阵,但是可以通过自定义嘚值的写入来覆盖Camera.worldToCaemraMatrix中的属性由于我们知道地面在什么情况下看起来是比较好的,所以我们不需要改变x轴或者y轴的输出具体来说,我们想要世界的方向总是与相机的方向一致由于矩阵的每一列都与每一个轴一一对应,因此我们仅需要改变z轴对应的那列即可那么代码看起来如下所示:

设置观察矩阵的最佳的位置是在camera的OnPreCull()事件方法中。该方法在所有的更新方法执行之后调用但是会在所有的渲染工作之前被調用。

使用鼠标或者是触摸输入的游戏需要将屏幕坐标系转换为世界坐标系在一个基本的2D游戏中,Camera.ScreenToWorldPoint()是足够使用的但是当使用自定义投影时,它变得有一些复杂尽管可以使用现有的unity 2dAPI来构建光线并检查它与场景的相交情况,但是如果你的场景都是平面的话那么有一个更加简便的方法。编写你自己的ScreenToWorldPoint()函数仅需要几行代码。基本的想法是unity 2d使用了观察-投影矩阵来将世界坐标系转换至屏幕上因此使用该矩阵嘚逆矩阵,我们能够将屏幕上的点转换至世界坐标系中通过改变矩阵来忽略Z轴,是能够忽略场景的深度并且仅得到平面上的点

将该转換分为两个部分可以提供更好的灵活性来通过矩阵缓存的方法在同一帧中转换更多的点。

为场景编辑器自定义投影 使用最少的代码可以使得unity 2d渲染类似经典的2D视频游戏中的自定义的投影,并且支持透视效果、输出以及自动的绘制顺序排序最后需要解决的问题时如何在unity 2d场景視图中将自定义投影通过WYSIWYG进行编辑。

幸运的是最近的unity 2d版本提供了hooks来完成该工作。首先相机脚本需要具有[ExecuteInEditMode]属性,否则只能在unity 2d处于播放模式时才能奏效接下来的代码,在上述列出的OnPreCull()代码上进行构建

这在场景视图中提供了一个有用的,但是并非很完美的编辑体验虽然你鈳以在检视器中较好的编辑一个对象,但是场景视图中的有一些控件可能是显示不正确的特别的,z轴的偏移变换不会显示在正确的位置仩并且矩形变换将会遇到错误的轴。其中一些问题可以通过禁用onPostRender事件来解决但是这样会导致别的问题。总之不会有一个完美的编辑体驗但是你能够对它进行更好的改进。

总结 所以使用一些额外的矩阵数学你能够为自己避免大量的麻烦。通过引擎来为你工作而不是通过3D引擎来获得伪2D引擎效果。作为奖励大量的效果,例如反射、阴影能够很简单的获得在Verdant Skies中,我们有额外的两个相机来采用不同的投影渲染场景反射效果可以通过将向上的矢量朝向相机的下方即可,而阴影效果将阴影朝向地面的方向即可

}

我要回帖

更多关于 unity 2d 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信