Unity实现角度限制

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

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

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

Unity实现角度限制_第1张图片
z = 30
Unity实现角度限制_第2张图片
z= -30

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

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

看着是没啥毛病,运行程序,看属性面板,当z开始为负数(0

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实现角度限制)