内容纲要

目标

08 – 子弹的消失,当子弹击中自身时不可发射子弹插图

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

子弹的消失

  • 首先打开我们的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);
        }
    }
    }

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

发表评论