Unity实现模拟仿真飞机起飞降落效果
程序员文章站
2022-07-13 22:25:53
...
Unity实现模拟仿真飞机起飞降落效果
前言
在最近的项目中,我实现了一个简单的飞机起飞、降落功能,运用了初中物理速度、加速度,以及Unity的Translate函数实现的。实现的难度一般,效果还可以,下面先说下飞机处于各个阶段的函数实现原理。
实现原理
1.起飞阶段
如图所示,飞机在起飞的时候有一个向前的速度V1,有一个向上的速度V0,V1与V0都是从0逐渐加大到一定的速度,当飞机上升到一定高度,就进入了第二个阶段:平飞阶段。
2.平飞阶段
如图所示,在平飞阶段,飞机没有了上升的速度,不再上升,且只有一个向前飞行的速度,这就是平飞阶段。
3.下降阶段
如图所示,在此阶段飞机有一个向下的速度,和一个向前的速度,且这两个速度越来越小,到了飞机的初始高度的时候,这两个速度分别为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.将此脚本挂载到飞机物体上,场景基本搭建如下图所示,在这里就不细说了。
实现效果
实现效果如下图所示:
推荐阅读