经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity射击游戏实例—物理碰撞的实现
来源:cnblogs  作者:炭烧鱿鱼丝  时间:2020/12/21 14:46:20  对本文有异议

前言:

 这一篇章实现物理碰撞,就是游戏体碰撞减装甲,这几天想要试着做出兼具装甲与血量的模式,可自动回复的装甲与永久损伤的血量,在一些平台上找到了不少有意思的模型,有兴趣的可以自己找找模型替换一下。

 

射击类游戏实例

 

作为第一个用来发布讲解的游戏,我立马就想到了射击类游戏,当然不是第一人称射击的那种,是打小飞机累计得分的那种类型,方便魔改参数以及自行制作一些敌人的模型。

游戏相关设定:

1.在游戏中,我们将操作战舰击坠敌人的飞船,游戏开始后战舰会向前推进,消灭敌人取得分数,战舰被击落游戏才会结束。

2.战舰拥有固定装甲(血量),敌人有多种并拥有独特的飞行轨迹与装甲

3.屏幕上会显示血量、得分等内容

4.待添加

 

涉及的英文:

enemy:敌人         box collider:盒碰撞器                  physics:物理                  Gravity: 重力           Rigidbody:刚体             Kinematic:运动学的       Trigger: 触发       

 

 

介绍:

1.UpdaMove函数用来执行敌人的移动,使用了Sin函数使数值在-1~1之间循环往复实现往复运动。

2.Time.time是游戏的进行时间。

3.other.tag=="PlayerRocket"比较字符串判断碰撞体是否为主角子弹。

4.Rocket rocket=other.GetComponent<Rocket>()语句获得了对方碰撞体的Rocket脚本组件。

5.m_life-=rocket.m_power语句会逐步减少装甲,到0时使用Destory消除游戏体。

 

 

操作:

1.创建Enemy.cs脚本,编写代码实现敌人游戏体的移动

  1. protected virtual void UpdateMove()
  2. {
  3. float rx = Mathf.Sin(Time.time) * Time.deltaTime;
  4. transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));
  5. }

 

2.建立敌人游戏体的prefab,并将Enemy脚本指定给它

 

3.给敌人游戏体添加碰撞体,【Component】—【Physics】—【Box Collider】,在Inspector窗口找到【Is Trigger】,勾选上

 

 

4.添加刚体组件,【Component】—【Physics】—【Rigidbody】,取消【Use Gravity】,勾选【Is Kinematic】

 

 

5.给主角重复上述操作

6.【Edit】—【Project Settings】—【Tags and Layers】,新建新的Tag,PlayerRocket和Enemy,选中敌人的prefab修改tag为Enemy,子弹的tag为PlayerRocket,主角的tag为Player(内置的没有就自己创建)

 

 

 7.打开Rocket.cs编写代码实现子弹的碰撞消失

  1. private void OnTriggerEnter(Collider other)
  2. {
  3. if (other.tag != "Enemy")
  4. {
  5. return;
  6. }
  7. else
  8. {
  9. Destroy(this.gameObject);
  10. }
  11. }

 

8.打开Player.cs编写代码实现主角的碰撞消失

  1. private void OnTriggerEnter(Collider other)
  2. {
  3. if (other.tag != "PlayerRocket"){
  4. m_life -= 1;
  5. if (m_life <= 0)
  6. {
  7. Destroy(this.gameObject);
  8. }
  9. }
  10. }

 

9.打开Enemy.cs编写代码实现敌人的碰撞消失与飞出屏幕外自我消失

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. [AddComponentMenu("MyGame/Enemy")]
  5. public class Enemy : MonoBehaviour
  6. {
  7. public float m_speed = 1;
  8. public float m_life = 10;
  9. protected float m_rotspeed = 30;
  10. public Renderer m_renderer;
  11. internal bool m_isActiv = false;
  12. void OnTriggerEnter(Collider other)
  13. {
  14. if (other.tag == "PlayerRocket")
  15. {
  16. rocket rocket = other.GetComponent<rocket>();
  17. if (rocket != null)
  18. {
  19. m_life -= rocket.m_power;
  20. if (m_life <= 0)
  21. {
  22. Destroy(this.gameObject);
  23. }
  24. }
  25. }
  26. else if (other.tag == "Player")
  27. {
  28. m_life = 0;
  29. Destroy(this.gameObject);
  30. }
  31. }
  32. // Start is called before the first frame update
  33. void Start()
  34. {
  35. m_renderer = this.GetComponent<Renderer>();
  36. }
  37. private void OnBecameVisible()
  38. {
  39. m_isActiv = true;
  40. }
  41. // Update is called once per frame
  42. void Update()
  43. {
  44. UpdateMove();
  45. if (m_isActiv && !this.m_renderer.isVisible) // 如果移动到屏幕外
  46. {
  47. Destroy(this.gameObject); // 自我销毁
  48. }
  49. }
  50. protected virtual void UpdateMove()
  51. {
  52. float rx = Mathf.Sin(Time.time) * Time.deltaTime;
  53. transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));
  54. }
  55. }

 

 

再说一句:

突然发现很多简单预置函数没有说明,比如说Vector3,之后涉及多了另说明吧,另外像创建碰撞体时候涉及到重力之类的,后面有用到的具体实例说起来应该会很简单,

 

原文链接:http://www.cnblogs.com/zzuadj/p/14166474.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号