经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Fire Balls 06——子弹的消失,当子弹击中自身时不可发射子弹
来源:cnblogs  作者:优梦创客  时间:2019/9/10 10:30:35  对本文有异议

版权申明:

  • 本文原创首发于以下网站:
  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脚本编写如下代码:
  1. public class Projectile : MonoBehaviour
  2. {
  3. private Lober lober;
  4. private Tank ply;
  5. private void Start()
  6. {
  7. // 取得抛物线组件lober
  8. lober = GetComponent<Lober>();
  9. // 取得玩家组建ply
  10. ply = GameObject.FindWithTag("Player").GetComponent<Tank>();
  11. }
  12. // 把子弹跟其他物体碰撞的脚本写在这里
  13. private void OnCollisionEnter(Collision collision)
  14. {
  15. // 子弹跟谁发生了碰撞?
  16. if (collision.gameObject.tag == "Arch")
  17. {
  18. print("你碰到了圆环!");
  19. lober.endPos = ply.transform.position;
  20. lober.enabled = true;
  21. }
  22. else if (collision.gameObject.tag == "Tower")
  23. {
  24. print("你碰到了砖块!");
  25. // Step1:怎么取得砖块对象?
  26. // Step2:Unity中,用什么方法销毁一个对象?
  27. //Destroy(collision.gameObject); // 把整个塔都销毁了!
  28. //collision.gameObject.GetComponent<Tower>().DropTower(); // 塔向下销毁一层
  29. // Step3: 销毁子弹
  30. Destroy(this.gameObject);
  31. }
  32. }
  33. }
  • 这样就能实现我们想要的效果了。

当子弹命中自身时不可发射子弹

  • 打开我们的Tank脚本增加一个Bool变量,注意这个变量得用Public命名,方便后续其他脚本的调用
    然后把我们的Update函数修改至如下:
  1. void Update()
  2. {
  3. // 如果游戏结束,就不处理子弹发射操作了!
  4. if (isGameOver)
  5. return;
  6. // 发射子弹
  7. if (Input.GetButton("Fire1")
  8. && Time.time - lastFireTime > 0.2f)
  9. {
  10. // 实例化(从预制体克隆)一个子弹
  11. var transProj = Instantiate(projPrefab).transform;
  12. // 设置子弹的位置在坦克设定好的炮口位置
  13. transProj.SetParent(this.transform, false);
  14. transProj.position = shotPos.position;
  15. Vector3 v = shotPos.forward * 100;
  16. transProj.GetComponent<Rigidbody>().AddForce(v, ForceMode.Impulse);
  17. Destroy(transProj.gameObject, 2f);
  18. lastFireTime = Time.time;
  19. }
  20. }

随后打开我们的Projectile脚本把代码修改如下:

  1. public class Projectile : MonoBehaviour
  2. {
  3. private Lober lober;
  4. private Tank ply;
  5. private void Start()
  6. {
  7. // 取得抛物线组件lober
  8. lober = GetComponent<Lober>();
  9. // 取得玩家组建ply
  10. ply = GameObject.FindWithTag("Player").GetComponent<Tank>();
  11. }
  12. // 把子弹跟其他物体碰撞的脚本写在这里
  13. private void OnCollisionEnter(Collision collision)
  14. {
  15. // 子弹跟谁发生了碰撞?
  16. if (collision.gameObject.tag == "Arch")
  17. {
  18. print("你碰到了圆环!");
  19. lober.endPos = ply.transform.position;
  20. lober.enabled = true;
  21. ply.isGameOver = true;
  22. }
  23. else if (collision.gameObject.tag == "Tower")
  24. {
  25. print("你碰到了砖块!");
  26. // Step1:怎么取得砖块对象?
  27. // Step2:Unity中,用什么方法销毁一个对象?
  28. //Destroy(collision.gameObject); // 把整个塔都销毁了!
  29. //collision.gameObject.GetComponent<Tower>().DropTower(); // 塔向下销毁一层
  30. // Step3: 销毁子弹
  31. Destroy(this.gameObject);
  32. }
  33. }
  34. }

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

原文链接:http://www.cnblogs.com/raymondking123/p/11463186.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号