欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity实现模拟仿真飞机起飞降落效果

程序员文章站 2022-07-13 22:25:53
...

Unity实现模拟仿真飞机起飞降落效果

前言

在最近的项目中,我实现了一个简单的飞机起飞、降落功能,运用了初中物理速度、加速度,以及Unity的Translate函数实现的。实现的难度一般,效果还可以,下面先说下飞机处于各个阶段的函数实现原理。

实现原理

1.起飞阶段
Unity实现模拟仿真飞机起飞降落效果
如图所示,飞机在起飞的时候有一个向前的速度V1,有一个向上的速度V0,V1与V0都是从0逐渐加大到一定的速度,当飞机上升到一定高度,就进入了第二个阶段:平飞阶段。
2.平飞阶段
Unity实现模拟仿真飞机起飞降落效果
如图所示,在平飞阶段,飞机没有了上升的速度,不再上升,且只有一个向前飞行的速度,这就是平飞阶段。
3.下降阶段
Unity实现模拟仿真飞机起飞降落效果
如图所示,在此阶段飞机有一个向下的速度,和一个向前的速度,且这两个速度越来越小,到了飞机的初始高度的时候,这两个速度分别为0,飞机也就停止了。

实现步骤

1.编写主要代码,主要代码如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace PlaneManager
{
    public enum thisPlaneState
    {
        Stop,
        BeginFly,
        Fly,
        EndFly
    }

    public class PlaneFlyTest : MonoBehaviour
    {
        //飞机的垂直速度
        float zSpeed = 0f;
        //战斗机的水平速度
        float xSpeed = 0f;
        //飞机垂直加速度
        float addZSpeed = 0.3f;
        //飞机的水平加速度
        float addXSpeed = 0.3f;
        //飞机的状态
        public thisPlaneState testPlaneState;
        // Use this for initialization
        void Start()
        {
            testPlaneState = thisPlaneState.Stop;
        }

        // Update is called once per frame
        void Update()
        {
            PlaneFly();
        }

        /// <summary>
        /// 开始起飞逻辑
        /// </summary>
        public void ToBeginFly()
        {
            testPlaneState = thisPlaneState.BeginFly;
        }

        public void ToEndFly()
        {
            testPlaneState = thisPlaneState.EndFly;
        }

        /// <summary>
        /// 飞机起飞
        /// </summary>
        void PlaneFly()
        {
            if (testPlaneState == thisPlaneState.BeginFly)
            {
                zSpeed += addZSpeed;
                xSpeed += addXSpeed;
                this.transform.Translate(Vector3.forward * xSpeed * Time.deltaTime);
                this.transform.Translate(Vector3.up * zSpeed * Time.deltaTime);
                if (this.transform.localPosition.y > 40.0f)
                {
                    testPlaneState = thisPlaneState.Fly;
                }
                ReStartPlane(this.transform,0f, 40.0f, -262.9f);
            }
            if (testPlaneState == thisPlaneState.Fly)
            {
                this.transform.Translate(Vector3.forward * xSpeed * Time.deltaTime);
                ReStartPlane(this.transform, 0f, 40.0f, -262.9f);
            }
            if (testPlaneState == thisPlaneState.EndFly)
            {
                zSpeed -= addZSpeed;
                xSpeed -= addXSpeed;
                this.transform.Translate(Vector3.forward * xSpeed * Time.deltaTime);
                this.transform.Translate(Vector3.down * zSpeed * Time.deltaTime);
                if (zSpeed < 0f && xSpeed < 0f)
                {
                    Debug.Log("123");
                    testPlaneState = thisPlaneState.Stop;
                }
                ReStartPlane(this.transform,0f, 40.0f, -262.9f);
            }
        }
        /// <summary>
        /// 重置飞机参数
        /// </summary>
        /// <param name="thisPlane">飞机Transform组件</param>
        /// <param name="posX">x坐标</param>
        /// <param name="posY">y坐标</param>
        /// <param name="posZ">z坐标</param>
        void ReStartPlane(Transform thisPlane,float posX,float posY,float posZ)
        {
            if (thisPlane.localPosition.z > 280f)
            {
                thisPlane.localPosition = new Vector3(posX,posY,posZ);
            }
        }
    }
}

这段代码实现了上述飞机起飞、降落的功能,主要实现思路是设置4个不同的枚举状态,使用枚举状态切换飞机的起飞、平飞、降落等效果。飞机的起飞、降落、平飞是使用Translate函数在Update中实现。
2.将此脚本挂载到飞机物体上,场景基本搭建如下图所示,在这里就不细说了。
Unity实现模拟仿真飞机起飞降落效果

实现效果

实现效果如下图所示:
Unity实现模拟仿真飞机起飞降落效果