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

版权申明:

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

目标

在这里插入图片描述

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

子弹的消失

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值