版权申明:

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

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

版权声明:本文为raymondking123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/raymondking123/p/11463186.html