当前位置:   article > 正文

unity3D实现发射子弹,自动门,车子前后左右移动_unityc#汽车行驶到左边

unityc#汽车行驶到左边

实现效果:

点击 “w” 键,坦克前进,点击 “s” 键,坦克后退,点击 “a” 键,坦克向左转,点击 “d” 键,坦克向右转。

点击 “空格” 键,坦克发射炮弹(这里的炮弹是一棵树),当炮弹碰到物体时,物体和炮弹都消失。

当坦克走近关卡时,关卡自动打开,当坦克远离关卡时,关卡自动闭合。

 

制作过程

 

坦克前后左右移动、发射炮弹:

 

  1. 添加一个坦克
  2. 为坦克添加 BoxCollider,Rigidbody 组件
  3. 新建 C# 脚本,脚本名为 TankController ,并将该脚本赋给坦克,脚本内容如下
  4. 为坦克添加一个 Sphere 圆柱体(坦克为父组件,圆柱体为子组件),为圆柱体添加 BoxCollider 组件。圆柱体的作用是标志炮弹发射的位置,为了视觉效果可以将圆柱体隐藏起来,即在属性中将 Mesh Renderer 前的勾去掉。
  5. 制作一个预制体,作为发射的炮弹,这里命名为 palm_01
  6. 为脚本中的共有变量赋值,speed:坦克前后移动时每秒移动的距离      rotspeed:坦克左右转动时每秒移动的距离   bullet:要发射的炮弹,将预制体palm_01拖动到这里    bulletspeed:炮弹发射速度     firePos:标志炮弹发射位置的物体,将第四步中的Sphere圆柱体拖动到此处。                                            
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class TankController : MonoBehaviour
  5. {
  6. public int speed;//坦克前后移动时每秒移动的距离
  7. public float rotspeed;//坦克左右转动时每秒移动的距离
  8. public GameObject bullet;//声明游戏对象:要发射的炮弹
  9. public int bulletspeed; //炮弹发射速度
  10. public Transform firePos; //标志炮弹发射位置的物体
  11. private Transform t;
  12. // Start is called before the first frame update
  13. void Start()
  14. {
  15. t = this.GetComponent<Transform>(); //获取本身和所有子子物体
  16. }
  17. void move1()
  18. { //实现前后左右移动的第一种方法,这里将他们封装在这个move1()函数里,并没有起到实际用。
  19. if (Input.GetKey(KeyCode.W)) //当按下W键时,坦克向前移动
  20. {
  21. //通过Translate()这个方法可以使得物体移动,里面有Vector3,(Vector3是一个三维向量,在unity中用于传递3D位置和方向),
  22. //通过在后面加入Time.deltaTime来使得物体移动更加的平滑。
  23. //里面还有一个Space.Self,它代表着以自身坐标系来移动,与之相对的还有Space.World,代表着是以世界坐标系来移动的。
  24. t.Translate(t.forward * Time.deltaTime * -speed, Space.World);
  25. }
  26. if (Input.GetKey(KeyCode.S))//当按下S键时,坦克向后移动
  27. {
  28. t.Translate(t.forward * Time.deltaTime * speed, Space.World);
  29. }
  30. if (Input.GetKey(KeyCode.A))//当按下A键时,坦克向右旋转
  31. {
  32. //使用localEulerAngles进行旋转的时候,我们要使用transform.localEulerAngles = new Vector3(x, y,z);
  33. //其中,new Vector(x,y,z)为游戏物体最终旋转到的目标角度,x.y,z的值分别都是以0为基准,假设游戏物体的初始角度为(x1,y1,z1),
  34. //则游戏物体从(x1,y1,z1)旋转到(x,y,z),同时也以自身坐标系为参考,而不是世界坐标系。
  35. t.localEulerAngles += new Vector3(0, 1 * rotspeed, 0);
  36. }
  37. if (Input.GetKey(KeyCode.D))//当按下D键时,坦克向左旋转
  38. {
  39. t.localEulerAngles -= new Vector3(0, 1 * rotspeed, 0);
  40. }
  41. }
  42. // Update is called once per frame
  43. void Update()
  44. {
  45. //实现前后左右移动的第二种方法
  46. float v = Input.GetAxis("Vertical"); //获取输入设备中所有垂直方向的偏移。范围(-1,1)
  47. float h = Input.GetAxis("Horizontal"); //获取输入设备中所有水平方向的偏移。范围(-1,1)
  48. Vector3 moveDir = new Vector3(h, 0, v);
  49. if (h!=0) //当水平方向的偏移不为0时发生旋转,排除垂直方向(即前后移动)的影响
  50. {
  51. Quaternion qua = Quaternion.LookRotation(moveDir); //求出当前物体的方向与即将移动到的方向moveDir的夹角
  52. transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * rotspeed);
  53. //缓慢旋转,第一个参数,从哪个角度开始转;第二个参数,要旋转的角度,第三个参数,旋转速度
  54. }
  55. transform.Translate(transform.forward * v * Time.deltaTime * -speed, Space.World); //前后移动
  56. if (Input.GetKeyDown(KeyCode.Space))//当按下空格键时,坦克发射炮弹
  57. {
  58. GameObject obj = Instantiate(bullet, firePos.position , bullet.transform.rotation);
  59. //bullet:生成对象 firePos.position :生成位置 bullet.transform.rotation:以什么角度生成。
  60. Rigidbody rig = obj.AddComponent<Rigidbody>(); //为生成的炮弹对象添加刚体组件:Rigidbody,便于检测它和物体发生碰撞
  61. rig.AddForce(transform.forward * -1 * bulletspeed);//为生成的炮弹对象添加初始的速度矢量
  62. }
  63. }
  64. }

 

自动门开关:

 

  1. 从资源包中找到自动门,添加一个到画面中
  2. 为自动门添加 BoxCollider组件
  3. 在属性中将 Is Trigger 勾选上                                                        
  4. 新建 C# 脚本,脚本名为 Door ,并将该脚本赋给自动门,脚本内容如下
  5. 为脚本中的共有变量赋值:在自动门下找到名为 pole 的子组件(即自动门的那根开关),将它赋给共有变量 D
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Door : MonoBehaviour
  5. {
  6. public Transform d;//这里将自动门的开关赋给d,以实现开关的旋转
  7. // Start is called before the first frame update
  8. void Start()
  9. {
  10. }
  11. void OnTriggerEnter(Collider c)//在脚本中添加这个函数,如果发生碰撞则执行此函数。(相撞的物体至少有一个勾选了isTrigger)
  12. {
  13. //当小车与自动门发生碰撞时,开关打开。
  14. d.localEulerAngles = new Vector3(0, 90, 0);
  15. }
  16. void OnTriggerExit(Collider c)//在脚本中添加这个函数,如果碰撞结束则执行此函数。(相撞的物体至少有一个勾选了isTrigger)
  17. {
  18. //当小车与自动门发生碰撞时,开关合上。
  19. d.localEulerAngles = new Vector3(0, 0, 0);
  20. }
  21. // Update is called once per frame
  22. void Update()
  23. {
  24. }
  25. }

 

碰撞后物体消失:

 

  1. 随便添加一个物体到画面中,作为炮弹的打击对象,这里添加的是一辆医用军车
  2. 为该物体添加 BoxCollider组件
  3. 新建 C# 脚本,脚本名为 Bullet,脚本内容如下
  4. 将该脚本赋给炮弹的预制体
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Bullet : MonoBehaviour
  5. {
  6. // Start is called before the first frame update
  7. void Start()
  8. {
  9. }
  10. void OnCollisionEnter(Collision other)
  11. //在脚本中添加这个函数,如果发生碰撞则执行此函数。other为与添加了此代码的物体相撞的另一个物体
  12. {
  13. Destroy(other.gameObject);//消灭另一个物体
  14. Destroy(this.gameObject);//消灭这个物体
  15. }
  16. // Update is called once per frame
  17. void Update()
  18. {
  19. }
  20. }

 

 

PS:如需完整项目,请移步 https://download.csdn.net/download/qq_42185999/11884672   进行下载(项目中包含所用全部资源包)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/98916
推荐阅读
相关标签
  

闽ICP备14008679号