在Unity(C#)中实现角度限制,有一个坑点(角度换算),相信大多数人都遇到过,本文会对其探究,同时补充点相机角度控制的算法。
1. 通过角度换算来实现角度限制
假设世界空间中存在一游戏物体Object,左手坐标系,以Z轴为朝向,如果属性面板中Rotator的z值为30,则逆时针旋转30度,如果-30则顺时针选择30度。
![](https://img.haomeiwen.com/i11757837/d7d5419fbaf1bb91.png)
![](https://img.haomeiwen.com/i11757837/7d5fa822ef737c5d.png)
很多人受到这个属性面板的影响,在写角度限制代码的时候(假设将角度限制在-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);
}
最后
本人水平不足,如果文章有问题请在评论区指出,谢谢。
网友评论