unity控制鸟的飞行模式

前言

在很多游戏中都会有控制飞行物的情况,可以通过研究对于鸟的控制来了解一些飞行模式

1,如何控制鸟飞行

为了尽量模拟鸟的飞行方式,采用下面的控制策略:

移动:

  • 按住W键控制鸟向前加速到最大速度并保持
  • 按住S键控制鸟减速到最小的速度
  • 不按住W键和S键则鸟同样缓慢减速

转向:

  • Space键控制鸟向下飞
  • Shift键控制鸟向上飞
  • 不按Space键和Shift键则鸟上下角度回正
  • A键和D键则控制物体左转和右转

2,通过代码来实现相关功能

移动的代码实现:

首先定义一个float变量speedOne作为控制物体的飞行速度,判断物体按下不同的按键时,speed做出不同的改变,然后在Update中调用speed控制物体的移动,使用transform.Translate来完成:

        if(Input.GetKey(KeyCode.W) && speedOne<10f)  
        {
    
    
            speedOne = speedOne + Time.deltaTime*0.2f;
        }
        //按下S键并且速度没达到最小,则速度减小
        if (Input.GetKey(KeyCode.D) && speedOne > 1f)  
        {
    
    
            speedOne = speedOne + Time.deltaTime * 0.2f;
        }
        //没有执行速度操作并且速度大于最小速度,则缓慢操作
        if (!Input.GetKey(KeyCode.W)&& !Input.GetKey(KeyCode.D)&&speedOne >1f)   
        {
    
    
            speedOne = speedOne - Time.deltaTime * 0.1f;
        }

        transform.Translate(Vector3.forward * speedOne * Time.deltaTime);  

转向代码的编写:

  • 首先就是实现按键的控制功能,可以让鸟进行正常的转向,首先是上下的转向,当按下Space和Shift键时开始转向:
        //按下空格,若在可旋转角度,则向上旋转
        if (Input.GetKey(KeyCode.Space) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 350))
        {
    
    
            transform.Rotate(Vector3.left * 0.1f);
        }
        //按下左Shift键,若在可旋转角度,则向下旋转
        if (Input.GetKey(KeyCode.LeftShift) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 350))
        {
    
    
            Debug.Log("yes");
            transform.Rotate(Vector3.right * 0.1f);
        }
  • 当没有按下控制上下的键时,上下角度回正,使用欧拉角来进行操作时要将角度分开来判断,并使用插值将角度回正:
        if (!Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.LeftShift)&& transform.eulerAngles.x != 0)
        {
    
    
            if(transform.eulerAngles.x<=40)      //为保证不出错,要比最大旋转角度大
                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z), 0.1f);
            if(transform.eulerAngles.x>=330)     //欧拉角角度是0~360,所以分开判断
                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(380, transform.eulerAngles.y, transform.eulerAngles.z), 0.01f);
        }
  • 鸟的左右旋转的控制,并保证鸟不侧翻:
        //使用A和D来控制物体左右旋转
        y = Input.GetAxis("Horizontal") * 10f * Time.deltaTime;       
        transform.Rotate(0,y,0);
        if (transform.eulerAngles.z!=0)
        {
    
    
            transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
        }

总结

话不多说,附上完整代码:

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

public class Bordrun : MonoBehaviour
{
    
    
    private float y;
 
    float speedOne = 1f;
    // Update is called once per frame
    void Update()
    {
    
    
        //鼠标隐藏
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
        //按下W键并且速度没达到最大,则速度增加
        if(Input.GetKey(KeyCode.W) && speedOne<10f)  
        {
    
    
            speedOne = speedOne + Time.deltaTime*0.2f;
        }
        //按下S键并且速度没达到最小,则速度减小
        if (Input.GetKey(KeyCode.D) && speedOne > 1f)  
        {
    
    
            speedOne = speedOne + Time.deltaTime * 0.2f;
        }
        //没有执行速度操作并且速度大于最小速度,则缓慢操作
        if (!Input.GetKey(KeyCode.W)&& !Input.GetKey(KeyCode.D)&&speedOne >1f)   
        {
    
    
            speedOne = speedOne - Time.deltaTime * 0.1f;
        }

        transform.Translate(Vector3.forward * speedOne * Time.deltaTime);  
        //使用A和D来控制物体左右旋转
        y = Input.GetAxis("Horizontal") * 10f * Time.deltaTime;       
        transform.Rotate(0,y,0);


        //按下空格,若在可旋转角度,则向上旋转
        if (Input.GetKey(KeyCode.Space) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 340))
        {
    
    
            transform.Rotate(Vector3.left * 0.1f);

        }
        //按下左Shift键,若在可旋转角度,则向下旋转
        if (Input.GetKey(KeyCode.LeftShift) && !(transform.eulerAngles.x >= 30 && transform.eulerAngles.x <= 340))
        {
    
    
            Debug.Log("yes");
            transform.Rotate(Vector3.right * 0.1f);
        }

        if (!Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.LeftShift)&& transform.eulerAngles.x != 0)
        {
    
    
            if(transform.eulerAngles.x<=40)      //为保证不出错,要比最大旋转角度大
                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z), 0.1f);
            if(transform.eulerAngles.x>=330)     //欧拉角角度是0~360,所以分开判断
                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, new Vector3(380, transform.eulerAngles.y, transform.eulerAngles.z), 0.01f);
        }

        if (transform.eulerAngles.z!=0)
        {
    
    
            transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xinzhilinger/article/details/109560938