飞机起飞降落

第一版:飞机起飞降落脚本

   最大速度是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,然后拖到转轴的位置,替换本来转轴的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值