当前位置:   article > 正文

【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)_unity机械拆装虚拟仿真

unity机械拆装虚拟仿真

需要源码和资源包请点赞关注收藏后评论区留言私信~~~

上一篇博客介绍了如何搭建飞机场景、制作了飞机引擎开启喷射火焰,并且让飞机起飞了参考链接如下

飞机场景搭建

一、效果展示

其中按空格可以控制后部引擎开关 即喷火和不喷火

 

 

演示视频如下

拆装飞机控制引擎

 

接下来实现飞机的拆装功能,拆装功能在虚拟仿真项目开发中很常见,实现的方式也很多,我们下面用点位移动的方式进行拆分功能的实现

二、搭建飞机零件拆装场景

Unity 3D中双击打开Level3场景,接下来在上一次搭建的场景中完成拆装功能的实现(需要导入资源包)

Hierarchy视图中的Aircraft对象,选择它并且使用快捷键Ctri+D复制一份,将Aircraft对象隐藏,将复制出来的对象的子对象进行手动拆分,移动到合理的位置,这样拆分就已经完成了

接下来设置Main Camera 让摄像机投射下来,设置position和rotation

接下来实现飞机零件拆分

在Project视图的Scripts文件夹,右击选择Create->C# Script命令新建一个脚本,命名为AircraftSplits,双击 编辑脚本 代码如下

  1. using UnityEngine;
  2. public class AircraftSplits : MonoBehaviour
  3. {
  4. public GameObject[] Aircraft; //飞机零件对象
  5. private Vector3[] AircraftOld; //飞机零件的旧位置
  6. public GameObject[] AircraftNew;//飞机零件的新位置
  7. void Start()
  8. {
  9. //设置旧位置
  10. AircraftOld = new Vector3[Aircraft.Length];
  11. for (int i = 0; i < Aircraft.Length; i++)
  12. {
  13. AircraftOld[i] = Aircraft[i].transform.position;
  14. }
  15. }
  16. private void Update()
  17. {
  18. if (Input.GetKeyDown(KeyCode.W))
  19. {
  20. //拆分
  21. SplitObject();
  22. }
  23. if (Input.GetKeyDown(KeyCode.S))
  24. {
  25. //合并
  26. MergeObject();
  27. }
  28. }
  29. private void SplitObject()
  30. {
  31. //将当前飞机零件分别移动到对应的新位置
  32. for (int i = 0; i < Aircraft.Length; i++)
  33. {
  34. Aircraft[i].transform.position = AircraftNew[i].transform.position;
  35. }
  36. }
  37. private void MergeObject()
  38. {
  39. //将当前飞机零件分别移动到对应的旧位置
  40. for (int i = 0; i < Aircraft.Length; i++)
  41. {
  42. Aircraft[i].transform.position = AircraftOld[i];
  43. }
  44. }
  45. }

接着将AircraftSplits组件拖到Aircraft对象上,然后将Aircraft对象下面的子对象拖入AircraftSplits组件Aircraft数组,将Aircraft对象下面的子对象拖入AircraftSplits组件AircraftNew数组

接着运行程序 W键拆分模型 S键合并模型 读者可以自行测试

当然此时移动比较生硬,接下来修改代码 使用对象移动插件DoTween移动对象 修改代码如下

  1. using DG.Tweening;
  2. using UnityEngine;
  3. public class AircraftSplits : MonoBehaviour
  4. {
  5. public GameObject[] Aircraft; //飞机零件对象
  6. private Vector3[] AircraftOld; //飞机零件的旧位置
  7. public GameObject[] AircraftNew;//飞机零件的新位置
  8. void Start()
  9. {
  10. //设置旧位置
  11. AircraftOld = new Vector3[Aircraft.Length];
  12. for (int i = 0; i < Aircraft.Length; i++)
  13. {
  14. AircraftOld[i] = Aircraft[i].transform.position;
  15. }
  16. }
  17. private void Update()
  18. {
  19. if (Input.GetKeyDown(KeyCode.W))
  20. {
  21. //拆分
  22. SplitObject();
  23. }
  24. if (Input.GetKeyDown(KeyCode.S))
  25. {
  26. //合并
  27. MergeObject();
  28. }
  29. }
  30. private void SplitObject()
  31. {
  32. //将当前飞机零件分别移动到对应的新位置
  33. for (int i = 0; i < Aircraft.Length; i++)
  34. {
  35. Aircraft[i].transform.DOMove(AircraftNew[i].transform.position, 3, false);
  36. }
  37. }
  38. private void MergeObject()
  39. {
  40. //将当前飞机零件分别移动到对应的旧位置
  41. for (int i = 0; i < Aircraft.Length; i++)
  42. {
  43. Aircraft[i].transform.DOMove(AircraftOld[i], 3, false);
  44. }
  45. }
  46. }

三、飞机引擎控制

下面实现对飞机引擎的启动和关闭,按下空格可以控制飞机引擎的开关,即喷火和不喷火

继续修改AircraftSplits脚本 代码如下

  1. using DG.Tweening;
  2. using UnityEngine;
  3. public class AircraftSplits : MonoBehaviour
  4. {
  5. public GameObject[] Aircraft; //飞机零件对象
  6. private Vector3[] AircraftOld; //飞机零件的旧位置
  7. public GameObject[] AircraftNew;//飞机零件的新位置
  8. public GameObject[] Afterburner;//飞机喷射火焰
  9. private bool isFuel = false; //开启和关闭状态
  10. void Start()
  11. {
  12. //设置旧位置
  13. AircraftOld = new Vector3[Aircraft.Length];
  14. for (int i = 0; i < Aircraft.Length; i++)
  15. {
  16. AircraftOld[i] = Aircraft[i].transform.position;
  17. }
  18. }
  19. private void Update()
  20. {
  21. if (Input.GetKeyDown(KeyCode.W))
  22. {
  23. //拆分
  24. SplitObject();
  25. }
  26. if (Input.GetKeyDown(KeyCode.S))
  27. {
  28. //合并
  29. MergeObject();
  30. }
  31. if (Input.GetKeyDown(KeyCode.Space))
  32. {
  33. //启动和关闭飞机喷射火焰
  34. FuelEvent();
  35. }
  36. }
  37. private void SplitObject()
  38. {
  39. //将当前飞机零件分别移动到对应的新位置
  40. for (int i = 0; i < Aircraft.Length; i++)
  41. {
  42. Aircraft[i].transform.DOMove(AircraftNew[i].transform.position, 3, false);
  43. }
  44. }
  45. private void MergeObject()
  46. {
  47. //将当前飞机零件分别移动到对应的旧位置
  48. for (int i = 0; i < Aircraft.Length; i++)
  49. {
  50. Aircraft[i].transform.DOMove(AircraftOld[i], 3, false);
  51. }
  52. }
  53. private void FuelEvent()
  54. {
  55. if (isFuel)
  56. {
  57. Afterburner[0].gameObject.SetActive(true);
  58. Afterburner[1].gameObject.SetActive(true);
  59. isFuel = false;
  60. }
  61. else
  62. {
  63. Afterburner[0].gameObject.SetActive(false);
  64. Afterburner[1].gameObject.SetActive(false);
  65. isFuel = true;
  66. }
  67. }
  68. }

创作不易 觉得有帮助请点赞关注收藏~~~

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

闽ICP备14008679号