Unity2D如何制作一个炮台追踪主角发射子弹

Posted Z_hongli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity2D如何制作一个炮台追踪主角发射子弹相关的知识,希望对你有一定的参考价值。

一、前言

(一)、制作想法来源

前段时间为期末考试写了一篇博客,其中涉及到一个发射子弹击中主角的效果,由此想到了去制作一个发射子弹的炮台,其中考试的博客原文链接:点我跳转

(二)、效果预览

在这里插入图片描述

二、制作流程

(一)、准备

1.炮台素材,我为了简单,自己用PS做了一个炮台图片,就两张图片,PS导出格式为PNG,在Unity中注意如果不是PNG格式的,记得改为PNG格式
在这里插入图片描述在这里插入图片描述

当然你也可以在Unity里面创建image图片来拼接一个炮台,再修改其颜色,注意2D游戏里面层级要保持一致:在这里插入图片描述

(二)、炮台的旋转

1.将炮台在2D场景中摆放好,调整好相关的层级,将炮台的Order in Layer设置为4,炮台地的Order in Layer设置为3,让炮台显示在炮台地上在这里插入图片描述

在这里插入图片描述
2.调整炮台的中心,使图片中心在炮台的正方形的中心,我们在文件夹下找到炮台,点击Sprite Editor对其进行编辑来调整其中心点的位置,因为炮台的旋转是以正方形的中心为中心的,当然Pivot也能够修改图片的中心,但是修改的位置比较固定,所以我们用Sprite Editor来编辑。
在这里插入图片描述
打开Sprite Editor,将图片中心用鼠标移动到小正方的中心,然后Apply应用一下在这里插入图片描述
这样我们回到场景中,通过旋转炮台我们可以发现,炮台的旋转已经是按小正方形的中心来旋转了
在这里插入图片描述
2.我们实现让炮台随着目标转动起来,这里我已经做好了一个2D人物,并且能够让他移动,可以在我的博客主页找到这个案例文章,在这里我也将案例链接给大家:点我跳转
接下来我们为炮台写一个旋转代码,来让炮台指向目标角色,点击炮台,为它添加一个脚本,我的脚本名称为:BigGun

 public GameObject Player;

    void Update()
    {
        Vector2 direction = Player.transform.position - transform.position;
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        //这里还可以使用 Quaternion.Lerp来实现平滑旋转
        transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward);
        //参数里面的angle-90 减不减因人而异 因为我导入的图片的他的轴向不对
    }

来解释一下为什么这么写,也就是这个的原理:
1.我们首先要知道炮台和人物之间的坐标位置,得出其横纵的差距,通过其横纵的距离来计算一个角度,也就是tan值,画个图吧:
在这里插入图片描述
2.其次我们知道tanα之后,要将其转换为角度,涉及到数学知识为:

在代码中的表示:
在这里插入图片描述
再者我们要知道Mathf.Atan2函数的意思,在这里我查了一下官方的API:
在这里插入图片描述
找到了一个比较详细的解释这个函数的博客:点我跳转

我的理解是: Mathf.Atan2(direction.y, direction.x)将direction.y与 direction.x的角度计算出来,其结果为一个弧度值
角度=弧度×360/2π,代码表示就是:

 float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

3.再将得到的角度来作为旋转参数来实现旋转,使用函数的API
在这里插入图片描述
相关代码:

 transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward); //transform.rotation等于挂载脚本的位置

最后说明一下:

 transform.rotation = Quaternion.AngleAxis(angle-90f, Vector3.forward);
        //参数里面的angle-90 减不减因人而异 因为我导入的图片的他的轴向不对

如果我不减去90:
在这里插入图片描述
减去90后:
在这里插入图片描述
这个是跟导入图片时他的轴向有关,具体的你自己做的时候来看,然后将目标角色拖拽给脚本的Player中
在这里插入图片描述

(三)、炮台的检测和发射子弹

1.为炮台加上一个圆形2D碰撞检测器,并调整其大小到一定的范围
在这里插入图片描述
2.接下来我们来制作子弹,要知道子弹的发射它是需要rigidbody组件和collider 2D组件的,把导入的子弹图标拖动到场景中,为其添加rigidbody和collider 2D,同时设置他的层级到合适的位置
在这里插入图片描述
接下来为子弹写一个代码,我命名为Gunbullet


    private Rigidbody2D rigidbody;

    void Awake()
    {
        rigidbody = this.GetComponent<Rigidbody2D>(); //获取这个脚本的rigidbody 2D
    }

    private void Start()
    {
        Destroy(gameObject, 5); //五秒后摧毁这个物体
    }

    public void Lauch(Vector2 direction, float force)
    {
        rigidbody.AddForce(direction * force);  //direction是一个矢量

    }

在这里面有一个比较值得注意的是AddForce这个函数,其相关API为:
在这里插入图片描述
注意一定要是矢量,在这里我对其研究了下,相关的文章链接:点我跳转
在其最下面:在这里插入图片描述
在这里不作过多说明。
3.将其拖拽在文件夹下制作成为预制体:
在这里插入图片描述
4.为炮台添加代码(在这之前记得加圆形碰撞盒子 2D):

    public GameObject Aim;
    public GameObject BulletPrefab;
    public float N = 50;
   // public Rigidbody2D RubyRigidbody2D;
    bool isAttack = false; //模式1触发

    private Vector2 PlayerVect;
    private Vector2 AttackVect;

    float time = 0;
    void Update()
    {
        PlayerVect.x = Aim.transform.position.x;
        PlayerVect.y = Aim.transform.position.y;
        AttackVect.x = PlayerVect.x - this.transform.position.x; //两坐标相减 得出一个向量 表示方向
        AttackVect.y = PlayerVect.y - this.transform.position.y; //两坐标相减 得出一个向量 表示方向

        if (isAttack)
        {
            time = time + Time.deltaTime;
            if (time >= 0.25)
            {
                Launch();
                time = 0;
            }
        }
    }

    private void Launch()
    {
        GameObject bullet = Instantiate(BulletPrefab, transform.position, Quaternion.identity);  //Quaternion.identity 没有角度 (0,0,0)
        bullet.GetComponent<GunBulllet>().Lauch(AttackVect, N); //我的子弹上绑上的脚本是GunBullet
        //这里如果报错 你看看你的脚本名称是否和我的不一样 写自己脚本的名称
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Player")
        {
            isAttack = true;
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Player")
        {
            isAttack = false;
        }
    }

记得将发射口和子弹的collider 2D的is trigger勾上,不然无法触发检测:
在这里插入图片描述在这里插入图片描述
5.将目标角色的标签更改为Player,没有的话就自己添加
在这里插入图片描述
注意:如果你子弹射不出来,可能是因为力太小了,子弹上的rigidbody2D的重力太重了,导致了射不出去,想想丢铅球就明白了

(三)、最后效果图

在这里插入图片描述

三、结束语

1.如果你按着这篇案例做,发现按照我的步骤做不能够卓出来或者有错误,可以私信留言给我,我看到后会第一时间去解决
2.点击我的主页,有很多的实用案例,欢迎来看看,对大多数人都是友好的:点我跳转
3.人物移动的代码也在我的主页中,欢迎来看看

喜欢的话点个赞支持一下吧~

以上是关于Unity2D如何制作一个炮台追踪主角发射子弹的主要内容,如果未能解决你的问题,请参考以下文章

unity3D中制作了一个炮台,想让同一时间发射4枚子弹依次排在炮台前 怎么实现啊我用空的GameObject不行啊

unity怎么用C#写个发射子弹的脚本?

unity3d C#写发射子弹的程序怎么写

unity,射手游戏

Unity2D 敌人追踪/攻击/移动AI 第二期

Unity3D制作简易坦克旋转发射子弹