版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

目标

  • 子弹的消失
  • 当子弹命中自身时不可发射子弹

子弹的消失

  • 首先打开我们的PlatformRig预制体,并找到Tower把Tag更改为Tower并在其子节点添加一个Cylinder并把Scale的数值调整为(5,1,5)并移除所Transform以外的所有组件,然后添加Mesh Colider,接着把Tag也改为Tower,随后打开我们的Projectile脚本编写如下代码:
public class Projectile : MonoBehaviour
{
    private Lober lober;
    private Tank ply;

    private void Start()
    {
        // 取得抛物线组件lober
        lober = GetComponent<Lober>();

        // 取得玩家组建ply
        ply = GameObject.FindWithTag("Player").GetComponent<Tank>();
    }

    // 把子弹跟其他物体碰撞的脚本写在这里
    private void OnCollisionEnter(Collision collision)
    {
        // 子弹跟谁发生了碰撞?
        if (collision.gameObject.tag == "Arch")
        {
            print("你碰到了圆环!");

            lober.endPos = ply.transform.position;

            lober.enabled = true;


        }
        else if (collision.gameObject.tag == "Tower")
        {
            print("你碰到了砖块!");

            // Step1:怎么取得砖块对象?

            // Step2:Unity中,用什么方法销毁一个对象?
            //Destroy(collision.gameObject); // 把整个塔都销毁了!
            //collision.gameObject.GetComponent<Tower>().DropTower(); // 塔向下销毁一层

            // Step3: 销毁子弹
            Destroy(this.gameObject);
        }
    }
}
  • 这样就能实现我们想要的效果了。

当子弹命中自身时不可发射子弹

  • 打开我们的Tank脚本增加一个Bool变量,注意这个变量得用Public命名,方便后续其他脚本的调用
    然后把我们的Update函数修改至如下:
 void Update()
    {
        // 如果游戏结束,就不处理子弹发射操作了!
        if (isGameOver)
            return;

        // 发射子弹
        if (Input.GetButton("Fire1")
            && Time.time - lastFireTime > 0.2f)
        {
            // 实例化(从预制体克隆)一个子弹
            var transProj = Instantiate(projPrefab).transform;

            // 设置子弹的位置在坦克设定好的炮口位置
            transProj.SetParent(this.transform, false);
            transProj.position = shotPos.position;
            Vector3 v = shotPos.forward * 100;
            transProj.GetComponent<Rigidbody>().AddForce(v, ForceMode.Impulse);

            Destroy(transProj.gameObject, 2f);

            lastFireTime = Time.time;
        }
    }

随后打开我们的Projectile脚本把代码修改如下:

public class Projectile : MonoBehaviour
{
    private Lober lober;
    private Tank ply;

    private void Start()
    {
        // 取得抛物线组件lober
        lober = GetComponent<Lober>();

        // 取得玩家组建ply
        ply = GameObject.FindWithTag("Player").GetComponent<Tank>();
    }

    // 把子弹跟其他物体碰撞的脚本写在这里
    private void OnCollisionEnter(Collision collision)
    {
        // 子弹跟谁发生了碰撞?
        if (collision.gameObject.tag == "Arch")
        {
            print("你碰到了圆环!");

            lober.endPos = ply.transform.position;

            lober.enabled = true;

            ply.isGameOver = true;
        }
        else if (collision.gameObject.tag == "Tower")
        {
            print("你碰到了砖块!");

            // Step1:怎么取得砖块对象?

            // Step2:Unity中,用什么方法销毁一个对象?
            //Destroy(collision.gameObject); // 把整个塔都销毁了!
            //collision.gameObject.GetComponent<Tower>().DropTower(); // 塔向下销毁一层

            // Step3: 销毁子弹
            Destroy(this.gameObject);
        }
    }
}

这样就能实现我们的目标了

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!