c# - 夹紧角度时相机开始发疯
问题描述
我统一构建了一个第一人称控制器,我试图让它让相机跟踪鼠标位置,这样玩家就可以环顾四周,但是当我试图阻止玩家让相机倒置时,相机开始摇晃并且它弄乱了旋转相机的
// 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。)
推荐阅读
- python - 如何在 Python 中使用 PDFKit 发送 cookie?
- android - 编译时出错:ERROR: Cause: compileSdkVersion is not specified
- python - 为什么这个函数只返回列表中的第一项?
- python-3.x - Web Scraping - 迭代
- java - Flux.using 不发射项目
- php - Laravel 将时间戳转换为具有特定时区的日期
- c# - 如何知道当前文本框并通过按钮单击移动到下一个文本框
- java - 无法使用 SSL 运行 Spring Boot 应用程序
- node.js - 如何从打包的 Electron 应用程序运行可执行文件
- laravel - “laravel homestead vagrant up 错误”