Unity实现角度限制

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

  1. 通过角度换算来实现角度限制
    假设世界空间中存在一游戏物体Object,左手坐标系,以Z轴为朝向,如果属性面板中Rotator的z值为30,则逆时针旋转30度,如果-30则顺时针选择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;
   }

}
  1. 相机角度控制: 在玩第一人称游戏的时候可以通过调整相机角度看到不同位置,假设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);
    }   
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值