当我将FPS字符设置为90时,为什么我的FPS字符在Y轴上变为0

时间:2019-07-24 10:10:50

标签: c# unity3d camera rotation

我正在使用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);

}
}

2 个答案:

答案 0 :(得分:1)

它实际上与您的Rotation方法有关。 游戏将在开始时调用Update方法,而该方法将调用Rotation方法。在其中,您可以更新旋转的值,在游戏开始时该值将为0.0,并且在输入轴上不进行任何移动,因此开始时不进行任何旋转,最后您将旋转值更新为0.0,重新设置您在编辑器。

您想要做的是使摄像机或控制器旋转RotateYRotateX度。像这样:

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));
}

答案 1 :(得分:1)

Update的第一次调用中,GetAxis("Mouse X")返回0,因此

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);
}