前言
在很多游戏中都会有控制飞行物的情况,可以通过研究对于鸟的控制来了解一些飞行模式
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);
        }
    }
}
复制代码© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
