美文网首页
Unity实现角度限制

Unity实现角度限制

作者: Wilson403 | 来源:发表于2018-04-20 22:51 被阅读0次

    在Unity(C#)中实现角度限制,有一个坑点(角度换算),相信大多数人都遇到过,本文会对其探究,同时补充点相机角度控制的算法。

    1. 通过角度换算来实现角度限制

    假设世界空间中存在一游戏物体Object,左手坐标系,以Z轴为朝向,如果属性面板中Rotator的z值为30,则逆时针旋转30度,如果-30则顺时针选择30度。

    z = 30 z= -30

    很多人受到这个属性面板的影响,在写角度限制代码的时候(假设将角度限制在-30<X<30),是这样写的:

    if (transform.localEulerAngles.z<30f && transform.localEulerAngles.z>-30f){...}
    

    看着是没啥毛病,运行程序,看属性面板,当z开始为负数(0<x<-30)时(即顺时针旋转),此时会发现想逆时针旋转完全无法做到,多次检查,没毛病啊,度数在合理区间(-30<X<30)。导致这个问题的原因就在于,我们都被属性面板误导了,比如-1,实际就是359,怎么解决呢?写段角度换算的代码:

    public float CheckAngle(float value)  // 将大于180度角进行以负数形式输出
        {
            float angle = value - 180;  
    
            if (angle > 0)
            {
                return angle - 180;
            }
    
            if (value == 0)
            {
                return 0;
            }
    
            return angle + 180;
        }
    

    这样问题就解决了!下面给出完整代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class c001 : MonoBehaviour {
    
         
        private bool isrotatorA;
        private bool isrotatorD;
    
        // Use this for initialization
        void Start () {
            isrotatorA = true;
            isrotatorD = true;
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetKey(KeyCode.A)&&isrotatorA) {
                transform.Rotate (0, 0, 30 * Time.deltaTime);
                isrotatorD = true;
            }
    
            if (Input.GetKey(KeyCode.D) &&isrotatorD) {
                transform.Rotate (0, 0, -30 * Time.deltaTime);
                isrotatorA = true;
            }
    
            if (CheckAngle(transform.localEulerAngles.z)>30f) 
                isrotatorA = false;
    
            if (CheckAngle(transform.localEulerAngles.z)<-30f) 
                isrotatorD = false;
          
        }
        public float CheckAngle(float value)  // 将大于180度角进行以负数形式输出
        {
            float angle = value - 180;  
    
            if (angle > 0)
            {
                return angle - 180;
            }
    
            if (value == 0)
            {
                return 0;
            }
    
            return angle + 180;
        }
    
    }
    
    

    在Unity把代码文件添加到物体运行即可。

    2. 相机角度控制

    在玩第一人称游戏的时候可以通过调整相机角度看到不同位置,假设Y轴是没有限制的,X轴,限制一下好了,你也可以自己定义,核心代码如下:

    //根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)  
             float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
    
            //根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)  
            rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
            //角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value   
            rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);
    
            //总体设置一下相机角度  
            transform.localEulerAngles = new Vector3(-rotationY,rotationX, 0);
    

    如果是第三人称的话,还可以添加一个角色与相机距离的代码:

     void setdistance()//方法(函数),用于设置镜头与角色距离  
        {  
            if (Distance >= minDistance && Distance <= maxDistance)//如果距离数据在最大距离和最小距离之间  
            {  
                //距离等于自身减去鼠标滚轮反馈乘以灵敏度的值(此处加与减同样根据需求来定)  
                Distance -= Input.GetAxis("Mouse ScrollWheel")*MouseWheel_sensitivity;  
            }  
            else if (Distance < minDistance)//若距离数据小于最小值,则等于最小值  
            {  
                Distance = minDistance;  
            }  
            else if (Distance > maxDistance)//若距离数据大于最小值,则等于最大值  
            {  
                Distance = maxDistance;  
            }  
            //完成镜头距离设置  
          // transform.Translate(Vector3.back * Distance );  
          //transform.position  = new Vector3 (transform.position.x, transform.position.y + 1f, transform.position.z);
        }    
    

    最后

    本人水平不足,如果文章有问题请在评论区指出,谢谢。

    相关文章

      网友评论

          本文标题:Unity实现角度限制

          本文链接:https://www.haomeiwen.com/subject/bgqtlftx.html