Интегрирование скорости игрока в поворот камеры - PullRequest
1 голос
/ 10 февраля 2020

У меня есть камера, которая следует за игроком и вращается вокруг нее с помощью мыши. Я хотел бы знать, как я могу добавить более легкое вращение к камере в зависимости от скорости игроков в дополнение к вращению от мыши.

У меня есть этот код, но я не уверен, что ставить после " Input.GetAxis ("MouseX") ":

void UpdatePosition()
{
    Debug.Log(playerScript.velocity);

    lookHorizontal = Mathf.Clamp(Input.GetAxis("MouseX") /* + some additional rotation */, -10000, 10000);
    lookVertical = Mathf.Clamp(Input.GetAxis("MouseY") /* + some additional rotation */, -10000, 10000);

    if (lookHorizontal > global.joystickDeadZone || lookHorizontal < -global.joystickDeadZone)
    {
        offset = Quaternion.AngleAxis(lookHorizontal / (1 / global.lookSensitivity * 100), Vector3.up) * offset;
    }
    if (lookVertical > global.joystickDeadZone || lookVertical < -global.joystickDeadZone)
    {
        offset = Quaternion.AngleAxis(lookVertical / (1 / global.lookSensitivity * 100), -this.transform.right) * offset;
    }
    this.transform.position = Vector3.Slerp(this.transform.position, playerRealPosition + offset, positionLerpSpeed * Time.deltaTime);
}

1 Ответ

1 голос
/ 10 февраля 2020

Если нет ввода, найдите горизонтальное вращение, к которому камера хочет go, затем примените часть этого горизонтального вращения к смещению (для этого вы можете использовать Quaternion.RotateTowards) :

void UpdatePosition()
{
    Debug.Log(playerScript.velocity);

    lookHorizontal = Mathf.Clamp(Input.GetAxis("MouseX") /* + some additional rotation */,
            -10000, 10000);
    lookVertical = Mathf.Clamp(Input.GetAxis("MouseY") /* + some additional rotation */, 
            -10000, 10000);

    if (lookHorizontal > global.joystickDeadZone 
            || lookHorizontal < -global.joystickDeadZone)
    {
        offset = Quaternion.AngleAxis(lookHorizontal / (1 / global.lookSensitivity * 100),
                Vector3.up) * offset;
    }
    else
    {
        Vector2 flatPlayerVel = playerScript.velocity;

        if (flatPlayervel != Vector2.zero)
        {
            float autoAdjustSpeed = 20f; // find good constant or way to calculate
                                         // For example, could set to 0f for no auto adjust

            // Find horizontal rotation that velocity is trying to go towards 
            Vector2 flatCameraForward = transform.forward;            
            float angleDiff = Vector2.SignedAngle(flatCameraForward, flatPlayerVel);
            Quaternion goalRotation = Quaternion.AngleAxis(angleDiff, Vector3.up);

            // how much to auto move offset horizontally this frame
            Quaternion adjustRotation = Quaternion.RotateTowards(Quaternion.identity, 
                    goalRotation, autoAdjustSpeed * Time.deltaTime);

            offset = adjustRotation * offset;
        }
    }

    if (lookVertical > global.joystickDeadZone || lookVertical < -global.joystickDeadZone)
    {
        offset = Quaternion.AngleAxis(lookVertical / (1 / global.lookSensitivity * 100), 
                -this.transform.right) * offset;
    }
    this.transform.position = Vector3.Slerp(this.transform.position, 
            playerRealPosition + offset, 
            positionLerpSpeed * Time.deltaTime);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...