Активировать функцию после завершения предыдущего в обновлении Unity C # - PullRequest
0 голосов
/ 24 мая 2018

Это не полный сценарий.Я показываю только ту часть, с которой у меня проблемы.

Проблема, с которой сталкиваются:

Я хотел сделать аккуратный и чистый скрипт, поэтому я вызываю только функции в своем обновлении.

Я хотел бы ввести ( StartGameFreezeMovement ) в первую строку обновления.

Я не мог этого сделать.Как и остальные функции, потому что в этой есть таймер.

Требуется результат:

Мое намерение состоит в том, чтобы найти способ для первой функции в обновлении полностью завершить, затем загрузить или активировать остальные.

Как мне этого добиться?

public class PlayerController : MonoBehaviour {

private CharacterController controller;
public float speed;
private Vector3 moveVector;
private float verticalVelocity;
public float gravity;
private float animationDuration = 3.0f;
public Text text;
private float timer;
//-------------------------------------------------------------------------
void Start ()
{
    text.text = "";
    controller = GetComponent<CharacterController>();
}
//-------------------------------------------------------------------------
// Update is called once per frame
void Update ()
{
    if(Time.time < animationDuration)
    {
        PlayerMovingForward();
        return; //getout of if...
    }
    StartText();
    PlayerMovingForward();
    PlayerLeftnRight();
    PlayerFalloffGravity();
}
//----------------------------------
void StartGameFreezeMovement()
{
    if (Time.time < animationDuration)
    {
        PlayerMovingForward();
        return; //getout of if...
    }
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Мое намерение состоит в том, чтобы найти способ, чтобы первая функция в обновлении была полностью завершена, затем загрузить или активировать остальные.

Вам нужна функция сопрограммы.Функция Update является функцией void.Вам нужно будет создать функцию сопрограммы и запустить ее один раз, а затем убедиться, что она не завершается, так что она будет имитировать функцию Update, которая вызывается в каждом кадре.Это можно сделать, добавив цикл while и получив каждый кадр.

Наконец, превратите функцию StartGameFreezeMovement из void в функцию сопрограммы, затем измените if (Time.time < animationDuration) на while (Time.time < animationDuration) и получите внутриэто с yield return null;, так что другие сценарии получат шанс выполнения в ожидании завершения функции StartGameFreezeMovement.

Ниже приведена фиксированная версия кода из вашего вопроса:

private void Start()
{
    //Start once
    StartCoroutine(YieldableUpdate());
}

IEnumerator YieldableUpdate()
{
    //Call and wait for the StartGameFreezeMovement function to finish
    yield return StartGameFreezeMovement();

    //Run forever
    while (true)
    {
        StartText();
        PlayerMovingForward();
        PlayerLeftnRight();
        PlayerFalloffGravity();

        //Wait a frame so that Unity doesn't freeze
        yield return null;
    }
}

IEnumerator StartGameFreezeMovement()
{
    while (Time.time < animationDuration)
    {
        PlayerMovingForward();
        //Wait a frame so that Unity doesn't freeze
        yield return null;
    }
}

Если вам нужно несколько раз проверить StartGameFreezeMovement() ход yield return StartGameFreezeMovement(); внутри цикла while (true), в противном случае эта проверка будет выполняться только один раз.

0 голосов
/ 24 мая 2018

Вы можете изменить свой StartGameFreezeMovement на bool.

bool StartGameFreezeMovement()
{
    if (Time.time < animationDuration)
    {
        PlayerMovingForward();
        return true; //getout of if...
    }
    return false;
}

Затем изменить функцию обновления.А затем, чтобы сохранить его в чистоте, используйте return, если вы не прошли логическую проверку, чтобы досрочно выйти из функции обновления.

void Update ()
{
    if (!StartGameFreezeMovement())
    {
        return;
    }

    StartText();
    PlayerMovingForward();
    PlayerLeftnRight();
    PlayerFalloffGravity();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...