一、渲染顺序
在Unity中,渲染层级是指控制场景中不同对象渲染顺序的一种机制。这个机制允许你指定对象在渲染时的顺序,确保它们以正确的顺序呈现在屏幕上。
Sorting Layer(排序层):
Sorting Layer是Unity中用于控制渲染层级的一种机制。每个对象都可以分配到一个特定的Sorting Layer中。
Order in Layer(层内顺序):
Order in Layer是指在同一Sorting Layer中,对象的渲染顺序。它是一个整数值,数值越小,渲染顺序越靠前。
通过设置不同的Sorting Layer和Order in Layer,可以控制对象的渲染顺序,从而达到类似于渲染优先级的效果。这对于确保场景中的不同对象按照正确的顺序进行绘制非常重要,尤其是在处理2D游戏、UI元素等方面。
图层顺序的值越小会越先渲染,实际表现如下:
将坦克的图层顺序设置为0,植物的图层顺序设置为1,效果如下
如果想要坦克在上面,将其数值调换即可。
二、坦克的攻击
坦克的攻击使用的是子弹的预制体,因此就要涉及到预制体的实例化:
预制体实例化:
在脚本中引用预制体: 在脚本中声明一个公共变量,用于存储预制体的引用。
public GameObject explodePrefabs;
实例化预制体: 使用 Instantiate 函数在场景中创建预制体的实例。你可以指定位置、旋转和父对象等信息
Instantiate(explodePrefabs, transform.position, transform.rotation);
第一个参数是实例化哪个预制体,
第二个参数是实例化预制体的位置,
第三个参数是旋转的角度
操作实例化后的对象: 可以对实例化后的对象进行任何操作。
这里想要让子弹的朝向跟坦克的朝向保持一致,因此子弹产生的角度应该是当前坦克的角度+子弹应该旋转的角度。其中的这个角度参数是一个四元数类型的参数,由于每一个游戏物体身上的这个rotation显示的度数是欧拉角,它并不是四元数。
所以我们想要让这个子弹有一个旋转角度,我们就应该把我们想要让它旋转的那个角度转成一个四元数。
那么我们怎样把一个欧拉角变成一个四元数类型的变量呢?
可以借助以一个欧拉角转四元数的api
Quaternion.Euler()
示例:子弹产生的角=当前坦克的角度+子弹应该旋转的角度
获取坦克的旋转角度 transform.eulerAngles
获取子弹应该旋转的角度,要获取这个首先定义一个欧拉类型的变量
private Vector3 bullectAulerAngles;
这个子弹的旋转角度可以通过输入的方向键来确定
float h = Input.GetAxisRaw("Horizontal");
if (h < 0)
{
bullectEulerAngles = new Vector3(0, 0, 90);
}
else if (h > 0)
{
bullectEulerAngles = new Vector3(0, 0, -90);
}
float v = Input.GetAxisRaw("Vertical");
if (v < 0)
{
bullectEulerAngles = new Vector3(0, 0, 180);
}
else if (v > 0)
{
bullectEulerAngles = new Vector3(0, 0, 0);
}
最后代码:
Instantiate(explodePrefabs, transform.position,Quaternion.Euler(transform.eulerAngles+bullectEulerAngles));
现在子弹的方向就和坦克运动方向一致了;
为子弹添加一个速度,思路:想要子弹朝着前方运动
移动要使用Translate方法,一个参数是移动的举例,第二个参数是相对的坐标系。
transform.Translate(transform.up* moveSpeed * Time.deltaTime, Space.World);
三、触发检测
在Unity中,触发器(Trigger)是一种与其他Collider组件交互的特殊类型的Collider。与普通Collider不同,触发器不会引起物体之间的物理碰撞反应,而是用于检测物体进入或离开特定区域。触发器通常用于实现与游戏逻辑相关的事件。
为子弹添加一个触发器,添加一个组件Box Collider 2D,然后将是触发器勾选上就让子弹成为了触发器了:
发生触发检测的必要条件为:
两方必须都有碰撞器,并且其中一方要选中是触发器,最好运动的一方有被添加刚体Rigibody 2D组件。
想要两个物体发生触发检测,就需要在子弹的脚本里面写触发检测。
OnTriggerEnter(Collider other): 当其他Collider进入触发器区域时调用。在脚本中实现这个方法,可以定义当某物体进入触发器时应该执行的代码。
OnTriggerExit(Collider other): 当其他Collider离开触发器区域时调用。类似于OnTriggerEnter,可以在这个方法中定义离开触发器时应该执行的代码。
OnTriggerStay(Collider other): 当其他Collider在触发器区域内停留时每帧调用。可以用于处理持续触发的事件。