zoukankan      html  css  js  c++  java
  • 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);
    		}
    	}
    }
    

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

  • 相关阅读:
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 833 字符串中的查找与替换(暴力模拟)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 832 翻转图像(位运算)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    Java实现 LeetCode 831 隐藏个人信息(暴力)
    how to use automapper in c#, from cf~
  • 原文地址:https://www.cnblogs.com/raymondking123/p/11463186.html
Copyright © 2011-2022 走看看