说到旋转,在 Unity 中有一件事我真的无法理解。如果你能帮助我理解这个机制,请尽量让解释尽可能简单,因为我的数学不是很好,实际上我有点挣扎。当我在 Y 轴上对我的游戏对象应用旋转时,游戏对象旋转将其 Y 轴定位在全局坐标上,同时在 X 或 Z 轴上旋转 GO,它旋转将其轴定位在自坐标系上(因此基于其 X和 Z 轴在空间中定向)。我的意思是,它看起来很适合游戏玩法,因为我正在尝试为相机创建旋转(代表玩家视图),但为什么 Unity 以这种方式处理旋转?我会粘贴代码来展示我做事的方式,这样也许你会更容易理解发生了什么。
public class Player : MonoBehaviour
{
[Header("Camera")]
[SerializeField] private Camera _camera;
[SerializeField] private Vector2 _xMinMaxRotation = new Vector2(-90, 90);
[SerializeField] private Vector2 _yMinMaxRotation = new Vector2(-90, 90);
[SerializeField] private float _mouseXSensistivity = 1;
[SerializeField] private float _mouseYSensistivity = 1;
[SerializeField] private float _mouseZSensistivity = 1;
[SerializeField] private float _xStartRotation = 0;
[SerializeField] private float _yStartRotation = 0;
private Vector2 _mouseDelta;
private float _rotY, _rotX, _rotZ;
public GameObject head;
// Start is called before the first frame update
void Start() {
Cursor.lockState = CursorLockMode.Locked;
Debug.Log(transform.eulerAngles);
}
// Update is called once per frame
void Update() {
_mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
MoveCamera();
//Debug.Log(_mouseDelta.x + " " + _mouseDelta.y);
}
private void MoveCamera() {
_rotX += _mouseDelta.x * _mouseXSensistivity * Time.deltaTime * 50;
_rotX = Mathf.Clamp(_rotX, _xMinMaxRotation.x, _xMinMaxRotation.y);
_rotY += _mouseDelta.y * _mouseYSensistivity * Time.deltaTime * 50;
_rotY = Mathf.Clamp(_rotY, _yMinMaxRotation.x, _yMinMaxRotation.y);
if (Input.GetKey(KeyCode.Q)) {
_rotZ += _mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ > 25) _rotZ = 25;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
else {
if (_rotZ > 0) {
_rotZ -= 2 * _mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ < 0) _rotZ = 0;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
}
if (Input.GetKey(KeyCode.E)) {
_rotZ += -_mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ < -25) _rotZ = -25;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
else {
if (_rotZ < 0) {
_rotZ += 2 * _mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ > 0) _rotZ = 0;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
}
transform.rotation = Quaternion.Euler(-_rotY, _rotX, _rotZ);
}
}
请不要给我发关于 Unity 中旋转如何工作的文章。这种方法太笼统了,可能无法帮助我理解。