第一版:飞机起飞降落脚本
最大速度是1200,螺旋桨速度到1000的时候飞机会上升,到850的时候会下降,
有上升状态,平飞状态和悬浮状态,三个状态按e都可以使螺旋桨减速然后下降
但是是匀速下降,并且不受物理引擎的影响
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
public class Helicopterfirst : MonoBehaviour
{
[SerializeField]private GameObject mainRotorObj; //主螺旋桨物体
[SerializeField] private GameObject tailRotorObj; //尾部螺旋桨物体
[SerializeField] private float rotSpeed = 0f; //旋转速度
[SerializeField] private bool isOnOff = false; //直升机引擎是否启动的标志
[SerializeField] private float rotAcceleration = 0f; //旋转加速度
public float rotorSpeedChangeRate = 2000f;
// 螺旋桨旋转的最大速度
//定义枚举类型,表示直升机的不同状态
public enum Status
{
ZeroEngine, //停机状态
RunEngine, //启动状态
TakeOff, //起飞状态
FlyForward, //平飞状态
floating,//悬浮状态
Landing//降落状态
}
Status helicopterStatus;//用于记录直升机当前状态的变量
void Start()
{
//检查主螺旋桨和尾部螺旋桨物体是否已指定
if (mainRotorObj == null || tailRotorObj == null)
Debug.LogError("部分子物体没有拽入参数栏"); //如果没有指定,则在控制台输出错误信息
}
void Update()
{
//检测玩家是否按下E键,用于控制引擎的开关
if (Input.GetKeyUp(KeyCode.E))
{
isOnOff = !isOnOff; //切换引擎状态
}
/* // 检查是否按下了E键
if (Input.GetKeyUp(KeyCode.E) && helicopterStatus == Status.FlyForward)
{
// 设置为降落状态
helicopterStatus = Status.Landing;
}
*/
//根据引擎的状态(开或关)更新直升机的状态
if (isOnOff == false)
{
//关闭引擎
helicopterStatus = Status.ZeroEngine;
}
else
{
//启动引擎
helicopterStatus = Status.RunEngine;
}
//确保旋转速度不会低于0或高于2000
if (rotSpeed < 0)
rotSpeed = 0;
if (rotSpeed > 1200f)
rotSpeed = 1200;
//基于旋转加速度更新旋转速度
rotSpeed += rotAcceleration;
//根据旋转速度旋转主螺旋桨和尾部螺旋桨
mainRotorObj.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
tailRotorObj.transform.Rotate(Vector3.left * rotSpeed * Time.deltaTime);
//根据旋转速度和直升机的位置更新直升机的状态
if (rotSpeed > 1000f&& isOnOff == true)
helicopterStatus = Status.TakeOff;
else if(isOnOff == false)
helicopterStatus = Status.ZeroEngine;
if (transform.position.y > 8f )
helicopterStatus = Status.FlyForward;
else if (isOnOff == false)
helicopterStatus = Status.ZeroEngine;
if (transform.position.z > 7f && isOnOff == true)
helicopterStatus = Status.floating;
else if (isOnOff == false)
helicopterStatus = Status.ZeroEngine;
if (rotSpeed <800 && transform.position.y > 0)
helicopterStatus = Status.Landing;
// 根据状态执行相应的操作
switch (helicopterStatus)
{
case Status.ZeroEngine:
rotAcceleration = -1f;
break;
case Status.RunEngine:
rotAcceleration = 1f;
break;
case Status.TakeOff:
transform.Translate(Vector3.up * 2f * Time.deltaTime);
break;
case Status.FlyForward:
transform.Translate(Vector3.forward * 2f * Time.deltaTime);
break;
case Status.floating://悬浮状态:
break;
case Status.Landing:
if (transform.position.y > 0)
{
transform.Translate(Vector3.down * 2f * Time.deltaTime);
}
else
{
// 当直升机降落到地面时,可以停止旋转和降落
rotSpeed = 0;
rotAcceleration = 0;
helicopterStatus = Status.ZeroEngine; // 或者设置为另一个合适的状态
}
break;
}
/* // 螺旋桨旋转逻辑(放在状态判断之后,因为降落时可能不需要旋转)
if (isOnOff)
{
rotSpeed += rotAcceleration;
rotSpeed = Mathf.Clamp(rotSpeed, 0f, 2000f); // 限制旋转速度在0到2000之间
mainRotorObj.transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime);
tailRotorObj.transform.Rotate(Vector3.left * rotSpeed * Time.deltaTime);
}*/
}
}
用到的模型为资源商店的免费模型,这个模型螺旋桨的旋转轴不对,要改一下,或者换模型
改轴就是整个cube,然后拖到转轴的位置,替换本来转轴的位置