需要源码和资源包请点赞关注收藏后评论区留言私信~~~
上一篇博客介绍了如何搭建飞机场景、制作了飞机引擎开启喷射火焰,并且让飞机起飞了参考链接如下
一、效果展示
其中按空格可以控制后部引擎开关 即喷火和不喷火
演示视频如下
拆装飞机控制引擎
接下来实现飞机的拆装功能,拆装功能在虚拟仿真项目开发中很常见,实现的方式也很多,我们下面用点位移动的方式进行拆分功能的实现
二、搭建飞机零件拆装场景
在Unity 3D中双击打开Level3场景,接下来在上一次搭建的场景中完成拆装功能的实现(需要导入资源包)
在Hierarchy视图中的Aircraft对象,选择它并且使用快捷键Ctri+D复制一份,将Aircraft对象隐藏,将复制出来的对象的子对象进行手动拆分,移动到合理的位置,这样拆分就已经完成了
接下来设置Main Camera 让摄像机投射下来,设置position和rotation
接下来实现飞机零件拆分
在Project视图的Scripts文件夹,右击选择Create->C# Script命令新建一个脚本,命名为AircraftSplits,双击 编辑脚本 代码如下
using UnityEngine; public class AircraftSplits : MonoBehaviour { public GameObject[] Aircraft; //飞机零件对象 private Vector3[] AircraftOld; //飞机零件的旧位置 public GameObject[] AircraftNew;//飞机零件的新位置 void Start() { //设置旧位置 AircraftOld = new Vector3[Aircraft.Length]; for (int i = 0; i < Aircraft.Length; i++) { AircraftOld[i] = Aircraft[i].transform.position; } } private void Update() { if (Input.GetKeyDown(KeyCode.W)) { //拆分 SplitObject(); } if (Input.GetKeyDown(KeyCode.S)) { //合并 MergeObject(); } } private void SplitObject() { //将当前飞机零件分别移动到对应的新位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.position = AircraftNew[i].transform.position; } } private void MergeObject() { //将当前飞机零件分别移动到对应的旧位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.position = AircraftOld[i]; } } }
接着将AircraftSplits组件拖到Aircraft对象上,然后将Aircraft对象下面的子对象拖入AircraftSplits组件Aircraft数组,将Aircraft对象下面的子对象拖入AircraftSplits组件AircraftNew数组
接着运行程序 W键拆分模型 S键合并模型 读者可以自行测试
当然此时移动比较生硬,接下来修改代码 使用对象移动插件DoTween移动对象 修改代码如下
using DG.Tweening; using UnityEngine; public class AircraftSplits : MonoBehaviour { public GameObject[] Aircraft; //飞机零件对象 private Vector3[] AircraftOld; //飞机零件的旧位置 public GameObject[] AircraftNew;//飞机零件的新位置 void Start() { //设置旧位置 AircraftOld = new Vector3[Aircraft.Length]; for (int i = 0; i < Aircraft.Length; i++) { AircraftOld[i] = Aircraft[i].transform.position; } } private void Update() { if (Input.GetKeyDown(KeyCode.W)) { //拆分 SplitObject(); } if (Input.GetKeyDown(KeyCode.S)) { //合并 MergeObject(); } } private void SplitObject() { //将当前飞机零件分别移动到对应的新位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.DOMove(AircraftNew[i].transform.position, 3, false); } } private void MergeObject() { //将当前飞机零件分别移动到对应的旧位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.DOMove(AircraftOld[i], 3, false); } } }
三、飞机引擎控制
下面实现对飞机引擎的启动和关闭,按下空格可以控制飞机引擎的开关,即喷火和不喷火
继续修改AircraftSplits脚本 代码如下
using DG.Tweening; using UnityEngine; public class AircraftSplits : MonoBehaviour { public GameObject[] Aircraft; //飞机零件对象 private Vector3[] AircraftOld; //飞机零件的旧位置 public GameObject[] AircraftNew;//飞机零件的新位置 public GameObject[] Afterburner;//飞机喷射火焰 private bool isFuel = false; //开启和关闭状态 void Start() { //设置旧位置 AircraftOld = new Vector3[Aircraft.Length]; for (int i = 0; i < Aircraft.Length; i++) { AircraftOld[i] = Aircraft[i].transform.position; } } private void Update() { if (Input.GetKeyDown(KeyCode.W)) { //拆分 SplitObject(); } if (Input.GetKeyDown(KeyCode.S)) { //合并 MergeObject(); } if (Input.GetKeyDown(KeyCode.Space)) { //启动和关闭飞机喷射火焰 FuelEvent(); } } private void SplitObject() { //将当前飞机零件分别移动到对应的新位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.DOMove(AircraftNew[i].transform.position, 3, false); } } private void MergeObject() { //将当前飞机零件分别移动到对应的旧位置 for (int i = 0; i < Aircraft.Length; i++) { Aircraft[i].transform.DOMove(AircraftOld[i], 3, false); } } private void FuelEvent() { if (isFuel) { Afterburner[0].gameObject.SetActive(true); Afterburner[1].gameObject.SetActive(true); isFuel = false; } else { Afterburner[0].gameObject.SetActive(false); Afterburner[1].gameObject.SetActive(false); isFuel = true; } } }
创作不易 觉得有帮助请点赞关注收藏~~~