以FPS旋转角色和相机

时间:2019-06-30 17:19:21

标签: c# unity3d

我正在尝试使相机在Unity中移动,但是我有一个问题,即使在播放之前我将其旋转为Y,播放器也始终会以0,0,0旋转开始。

我将代码沿Y轴旋转播放器,将摄像机沿X轴旋转,因此播放器在上下看时不会旋转。

代码如下:

public float cameraSpeed;
//public float smooth = 2;
[Range(0f, 1f)] public float smooth = 0.5f;
Vector2 mouseLook;
Vector2 smoothV;

private Transform cameraTransform;


void Start()
{
    //Inicializamos componentes
    rb = GetComponent<Rigidbody>();
    cameraTransform = Camera.main.transform;

    mouseLook.y = Mathf.Clamp(-cameraTransform.localRotation.x, -75, 50);
    mouseLook.x = transform.localRotation.y;
}

void CameraMovement()
{
    //Declaramos un vector con la direccion del raton
    Vector2 md = new Vector2(InputManager.main.HorizontalMouse(), InputManager.main.VerticalMouse());
    md *= cameraSpeed / smooth;
    smoothV = Vector2.Lerp(smoothV, md, smooth);
    mouseLook += smoothV;

    //Limitamos el angulo de la camara para que no de vueltas
    mouseLook = new Vector2(mouseLook.x, Mathf.Clamp(mouseLook.y, -75, 50));

    //Hacemos que rote la camara en el eje x y el jugador en el eje y
    Camera.main.transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
    transform.localRotation = Quaternion.AngleAxis(mouseLook.x  , transform.up);
}

2 个答案:

答案 0 :(得分:0)

因为您没有连续保持旋转值。您开始总是使用鼠标旋转,这就是为什么要保持旋转值

Camera.main.transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right) * Camera.main.transform.localRotation;
transform.localRotation = Quaternion.AngleAxis(mouseLook.x  , transform.up) * transform.localRotation;

答案 1 :(得分:0)

mouseLook在第一帧中始终为0, 0。所以当你这样做

mouseLook += smoothV;

第一次使用从zero向量开始的值。


您应该存储初始旋转(例如,同时保存mainCamera以避免始终通过Camera.main来获取旋转),例如

private Transform cameraTransform;

private void Start()
{
    cameraTransform = Camera.main.transform;

    mouseLook.y = MathfClamp(-cameraTransform.localRotation.x, -75, 50);
    mouseLook.x = transform.localRotation.y;
}

然后在您的smooth计算中,因为两个分量xy相等

md = Vector2.Scale(md, new Vector2(cameraSpeed * smooth, cameraSpeed * smooth));

您还可以使用简单的float乘法

md *= cameraSpeed * smooth;

然后可以使用{p>代替Lerpx组件,而不必单独使用

y

我实际上建议您更好地理解而不是使用

smoothV = Vector2.Lerp(smoothV, md, 1f / smooth);

然后相应地

[Range(0f, 1f)] public float smoothFactor = 0.5f;