• Fire Balls 08——子弹的消失,当子弹击中自身时不可发射子弹


    版权申明:

    • 本文原创首发于以下网站:
    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);
    		}
    	}
    }
    

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

  • 相关阅读:
    B. Vova and Trophies 字符串预处理+思维+贪心
    Got error 28 from storage engine
    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    mysql复制问题
    upgrade mysql
    replica set remove member
    Perl安装及环境配置
    Django
    mongo collection name—SyntaxError: identifier starts immediately after numeric literal
    MySQL 单表flashback
  • 原文地址:https://www.cnblogs.com/raymondking123/p/11463186.html
Copyright © 2020-2023  润新知