最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • unity控制鸟的飞行模式

    正文概述 掘金(心之凌儿)   2021-04-26   680

    前言

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

    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);
            }
        }
    }
    

    起源地下载网 » unity控制鸟的飞行模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元