Вращающийся персонаж и камера в FPS - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь сделать движение камеры в Unity, но у меня проблема, игрок всегда начнет вращение с 0,0,0, даже если я поверну его в Y перед игрой.

В коде я поворачиваю плеер по оси 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 голосов
/ 01 июля 2019

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 расчете, поскольку оба компонента x и y равны для

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

Вы также можете использовать простое умножение float, например

md *= cameraSpeed * smooth;

Тогда вместо Lerp компонентов x и y по отдельности вы можете использовать

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

Я бы порекомендовал для лучшего понимания использовать

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

и затем соответственно

md *= cameraSpeed / smoothFactor;
smoothV = Vector2.Lerp(smoothV, md, smoothFactor);
0 голосов
/ 01 июля 2019

Из-за того, что у вас нет постоянного значения вращения.Вы всегда начинали использовать вращение мыши, поэтому просто сохраняйте значение поворота как

Camera.main.transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right) * Camera.main.transform.localRotation;
transform.localRotation = Quaternion.AngleAxis(mouseLook.x  , transform.up) * transform.localRotation;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...