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