当前位置: 代码网 > it编程>编程语言>Asp.net > unity学习笔记

unity学习笔记

2024年08月01日 Asp.net 我要评论
通过设置不同的Sorting Layer和Order in Layer,可以控制对象的渲染顺序,从而达到类似于渲染优先级的效果。这里想要让子弹的朝向跟坦克的朝向保持一致,因此子弹产生的角度应该是当前坦克的角度+子弹应该旋转的角度。其中的这个角度参数是一个四元数类型的参数,由于每一个游戏物体身上的这个rotation显示的度数是欧拉角,它并不是四元数。这个机制允许你指定对象在渲染时的顺序,确保它们以正确的顺序呈现在屏幕上。移动要使用Translate方法,一个参数是移动的举例,第二个参数是相对的坐标系。

一、渲染顺序

在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在触发器区域内停留时每帧调用。可以用于处理持续触发的事件。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com