当我将 FPS 角色设置为 90 时,为什么它在 Y 轴上变为 0
Why is my FPS character turning to 0 on the Y axis when I have it set to 90
我正在使用 FPS 控制器,出于某种原因,当我点击播放时,当我将它旋转到 90 时,播放器在 y 轴上一直旋转到 0。我很确定它与相机有关,如果这有助于缩小范围。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Animator anim;
float RotateX;
float RotateY;
public static bool GamePaused;
[SerializeField]
[Header("Game Objects")]
public GameObject Camera;
[Header("Movement Settings")]
public float WalkSpeed = 5.0f;
[Header("Rotation Settings")]
public float RorationSpeed = 3.0f;
public float MaxYAxis = 60.0f;
public float MinYAxis = -48.0f;
private void Start()
{
anim = GetComponent<Animator>();
}
void Update()
{
Rotation();
Movement();
}
void Rotation()
{
RotateX += Input.GetAxis("Mouse X") * RorationSpeed;
RotateY += Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.localRotation = Quaternion.Euler(-RotateY, 0f, 0f);
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
}
void Movement()
{
transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * WalkSpeed * Time.deltaTime);
transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * WalkSpeed * Time.deltaTime);
}
}
其实跟你的Rotation
方法有关。
游戏一开始会调用Update
方法,会调用Rotation
方法。在那里你更新旋转值,在游戏开始时将为 0.0 并且输入轴上没有移动所以一开始没有旋转,最后你用 0.0 值更新你的旋转值,重置你在编辑.
您想做的是将相机或控制器旋转 RotateY
或 RotateX
度。类似于:
void Rotation()
{
RotateX = Input.GetAxis("Mouse X") * RorationSpeed;
RotateY = Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.Rotate(new Vecto3(-RotateY, 0f, 0f));
transform.Rotate(new Vector3(0f, RotateX, 0f));
}
在Update
的第一次调用中GetAxis("Mouse X")
returns0
所以
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
将旋转重置为 0, 0, 0
。
您应该简单地存储初始旋转
private void Awake()
{
RotateX = transform.rotation.eulerAngles.y;
RotateY = Camera.transform.localRotation.eulerAngles.x;
if (RotateY > 180)
{
RotateY = -(360 - RotateY);
}
}
private void Rotation()
{
RotateX += Input.GetAxis("Mouse X") * RorationSpeed;
RotateY -= Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.localRotation = Quaternion.Euler(RotateY, 0f, 0f);
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
}
我正在使用 FPS 控制器,出于某种原因,当我点击播放时,当我将它旋转到 90 时,播放器在 y 轴上一直旋转到 0。我很确定它与相机有关,如果这有助于缩小范围。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Animator anim;
float RotateX;
float RotateY;
public static bool GamePaused;
[SerializeField]
[Header("Game Objects")]
public GameObject Camera;
[Header("Movement Settings")]
public float WalkSpeed = 5.0f;
[Header("Rotation Settings")]
public float RorationSpeed = 3.0f;
public float MaxYAxis = 60.0f;
public float MinYAxis = -48.0f;
private void Start()
{
anim = GetComponent<Animator>();
}
void Update()
{
Rotation();
Movement();
}
void Rotation()
{
RotateX += Input.GetAxis("Mouse X") * RorationSpeed;
RotateY += Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.localRotation = Quaternion.Euler(-RotateY, 0f, 0f);
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
}
void Movement()
{
transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * WalkSpeed * Time.deltaTime);
transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * WalkSpeed * Time.deltaTime);
}
}
其实跟你的Rotation
方法有关。
游戏一开始会调用Update
方法,会调用Rotation
方法。在那里你更新旋转值,在游戏开始时将为 0.0 并且输入轴上没有移动所以一开始没有旋转,最后你用 0.0 值更新你的旋转值,重置你在编辑.
您想做的是将相机或控制器旋转 RotateY
或 RotateX
度。类似于:
void Rotation()
{
RotateX = Input.GetAxis("Mouse X") * RorationSpeed;
RotateY = Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.Rotate(new Vecto3(-RotateY, 0f, 0f));
transform.Rotate(new Vector3(0f, RotateX, 0f));
}
在Update
的第一次调用中GetAxis("Mouse X")
returns0
所以
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
将旋转重置为 0, 0, 0
。
您应该简单地存储初始旋转
private void Awake()
{
RotateX = transform.rotation.eulerAngles.y;
RotateY = Camera.transform.localRotation.eulerAngles.x;
if (RotateY > 180)
{
RotateY = -(360 - RotateY);
}
}
private void Rotation()
{
RotateX += Input.GetAxis("Mouse X") * RorationSpeed;
RotateY -= Input.GetAxis("Mouse Y") * RorationSpeed;
RotateY = Mathf.Clamp(RotateY, MinYAxis, MaxYAxis);
Camera.transform.localRotation = Quaternion.Euler(RotateY, 0f, 0f);
transform.rotation = Quaternion.Euler(0f, RotateX, 0f);
}