c# - 夹紧角度时相机开始崩溃

标签 c# unity3d

我在 unity 中构建了一个第一人称 Controller ,我正在努力做到这一点,以便相机跟踪鼠标位置,以便玩家可以环顾四周,但是当我尝试阻止玩家将相机倒置时,相机开始摇晃并且它搞乱相机的旋转

// Get Axis
float mouseY = Input.GetAxis(mouseYInputName) * mouseSensitivity * 
Time.deltaTime;
// Check if past limit
clampX += mouseY;
if (Mathf.Abs(clampX) < 90f) {
    transform.Rotate(Vector3.left * mouseY);
}
else {
    Vector3 eulerRotation = -transform.eulerAngles;
    eulerRotation.x = (clampX > 90f ? 270f : 90f);
    transform.eulerAngles = eulerRotation;
}

最佳答案

您的代码存在一些问题。

首先,您在将旋转分配给向量 (-transform.eulerAngles) 时将旋转负数,但随后只需将修改后的向量重新分配给变换。这将具有每帧翻转 Y 轴和 Z 轴旋转的效果。

此外,夹紧本身看起来有点不对劲。现在,当旋转移动超过 90° 时,它会立即捕捉到 270°,当它移动超过 -90° 时,它会捕捉到 90°。

另一个问题: 使用您当前的代码,如果玩家在夹紧已经开始后继续移动鼠标,则 clampX 变量仍在增加。因此,当玩家开始向另一个方向移动鼠标时,他们必须在相机开始移动之前再次将 clampX 值恢复到可接受的值。

这是一种希望不会出现这些问题的钳制方法:

clampX += mouseY;
if (Mathf.Abs(clampX) < 90f) {
    transform.Rotate(Vector3.right * mouseY);
}
else {
    if (clampX > 90f) clampX = 90f;
    else if (clampX < -90f) clampX = -90f;

    Vector3 eulerRotation = transform.eulerAngles;
    eulerRotation.x = clampX;
    transform.eulerAngles = eulerRotation;
}

(我还将 Vector3.left 替换为 Vector3.right,因为它在 Unity 中是正 X。)

关于c# - 夹紧角度时相机开始崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842546/

相关文章:

c# - HQL 与 Linq 到对象

c# - 在实现中用派生类覆盖接口(interface)方法返回类型

parse-platform - 如何使用子类查询关系数据? parse.com 和 Unity

c# - Unity C# 在执行访问列表变量时崩溃

c# - 我应该学习Java还是应该学习C++?

c# - 根据下拉框选择隐藏/显示表单

C# SQL 将数据库还原到默认数据位置

c# - 无法将类型string []隐式转换为string

c# - using语句中的异步方法

audio - 检测用户的音频并将其转换为文本以在Unity中命令AI机器人