赞
踩
需要源码和资源包请点赞关注收藏后评论区留言私信~~~
上一篇博客介绍了如何搭建飞机场景、制作了飞机引擎开启喷射火焰,并且让飞机起飞了参考链接如下
其中按空格可以控制后部引擎开关 即喷火和不喷火
演示视频如下
拆装飞机控制引擎
接下来实现飞机的拆装功能,拆装功能在虚拟仿真项目开发中很常见,实现的方式也很多,我们下面用点位移动的方式进行拆分功能的实现
在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;
- }
- }
- }
创作不易 觉得有帮助请点赞关注收藏~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。