Как можно плавно уменьшить значение, если игрок перестает нажимать LeftShift (GetKeyUp) - PullRequest
0 голосов
/ 27 февраля 2020

Так что я только учусь C#, и вы можете сказать, что я не очень хорош в этом, это основная часть моего текущего сценария, над которой мне нужно работать:

if (Input.GetKeyDown(KeyCode.LeftShift))
{
    speed = 10f;
    flySpeed = 6;
}

if (Input.GetKey(KeyCode.LeftShift))
{
    Camera.current.fieldOfView += 80 * Time.deltaTime;
}

if (Input.GetKeyUp(KeyCode.LeftShift))
{
    speed = 7f;
    flySpeed = 4;

    Camera.current.fieldOfView -= 250 * Time.deltaTime;
    Camera.current.fieldOfView = 100;
}

if (Camera.current.fieldOfView >= 110)
{
    Camera.current.fieldOfView = 110;
} 
else if (Camera.current.fieldOfView <= 100)
{
    Camera.current.fieldOfView = 100;
}

То, что я хочу сделать, это увеличить fieldOfView на моей текущей камере, когда удерживается LeftShift, и плавно уменьшить fieldOfView, когда отпускается LeftShift. Я попытался использовать это:

Camera.current.fieldOfView -= 250 * Time.deltaTime;
Camera.current.fieldOfView = 100;

, но это просто мгновенно изменило fieldOfView на 100 (walkFoV)

Ответы [ 2 ]

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

Вы хотите, чтобы FOV увеличивалось при нажатии кнопки и уменьшалось, когда ее нет. Давайте запишем это:

if (Input.GetKey(KeyCode.LeftShift))
    Camera.current.fieldOfView += 80 * Time.deltaTime;
else
    Camera.current.fieldOfView -= 250 * Time.deltaTime;

Возможно, вы захотите добавить здесь свою логику по умолчанию c вместо того, чтобы захватывать нажатие и отпускание кнопки:

if (Input.GetKey(KeyCode.LeftShift))
{
    Camera.current.fieldOfView += 80 * Time.deltaTime;
    speed = 10f;
    flySpeed = 6;
}
else
{
    Camera.current.fieldOfView -= 250 * Time.deltaTime;
    speed = 7f;
    flySpeed = 4;
}

В этом случае вы должны написать только один if вместо трех, хотя оба варианта вполне допустимы.

И ваш последний фрагмент кода можно упростить до:

Camera.current.fieldOfView = Mathf.Clamp(Camera.current.fieldOfView, 100, 110)
0 голосов
/ 27 февраля 2020

Причина, по которой он не является гладким, заключается в том, что этот код:

speed = 7f;
flySpeed = 4;
Camera.current.fieldOfView -= 250 * Time.deltaTime;
Camera.current.fieldOfView = 100;

Все операции выполняются в одном кадре (см. https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html).

Другими словами, он вызывается только один раз, поэтому поле обзора камеры сразу становится равным 100.

Я написал некоторый код, который сможет заменить ваш старый код и работать так, как вы этого хотите. , Еще одна (возможно, лучшая) альтернатива - использовать систему анимации Unity, настроив анимацию для увеличения и уменьшения масштаба камеры и установив триггер из сценария. (см. https://learn.unity.com/tutorial/controlling-animation#5c7f8528edbc2a002053b4e3)

Coroutine zoom;
float timer = 0f;

public Camera main;
public float zoomedOutValue = 110f;
public float zoomedInValue = 100f;
public float zoomDuration = 0.2f;

void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        if(zoom != null)
        {
            StopCoroutine(zoom);
        }

        zoom = StartCoroutine(ZoomCamera());
    }

    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        if(zoom != null)
        {
            StopCoroutine(zoom);
        }

        zoom = StartCoroutine(ZoomCamera(false));
    }
}

IEnumerator ZoomCamera(bool zoomIn = true)
{
    if(zoomIn)
    {
        while(timer < zoomDuration)
            {
                main.fieldOfView = Mathf.Lerp(zoomedOutValue, zoomedInValue, timer/zoomDuration);
                timer += Time.deltaTime;
                yield return null;
            }
        timer = zoomDuration;
        main.fieldOfView = zoomedInValue;
    }
    else
    {
        while(timer > 0f)
            {
                main.fieldOfView = Mathf.Lerp(zoomedOutValue, zoomedInValue, timer/zoomDuration);
                timer -= Time.deltaTime;
                yield return null;
            }
        timer = 0;
        main.fieldOfView = zoomedOutValue;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...