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

该文章介绍了如何在Unity3D中创建飞机拆装功能,通过C#脚本控制飞机零件的移动,使用DoTween实现平滑过渡。同时,文章还涉及了飞机引擎的启停控制,按空格键可切换引擎的喷火状态。
摘要由CSDN通过智能技术生成

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

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

飞机场景搭建

一、效果展示

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

 

 

演示视频如下

拆装飞机控制引擎

 

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

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

在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;
        }
    }
}

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

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值