Unity C#: изменение сцен путем чтения обратного вызова Boolean внутри voide Update () - PullRequest
1 голос
/ 14 февраля 2020

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

if (someVariable == true)
{
   SceneManager.LoadScene("MainScene");
}

Код, который вызывает начало калибровки:

private void Update()
        {
            if (Input.GetKeyDown(_startKey))
            {
                var calibrationStartResult = StartCalibration(
                    resultCallback: (calibrationResult) =>
                        Debug.Log("Calibration was " + (calibrationResult ? "successful" : "unsuccessful"))
                );

                Debug.Log("Calibration " + (calibrationStartResult ? "" : "not ") + "started");
            }
        }

Мне нужен способ использовать этот resultCallback внутри private void Update () для смены сцен, потому что resultCallback возвращает либо true, либо false, если калибровка моей системы VR прошла успешно. Кроме того, вот что StartCalibration () возвращает:

public bool StartCalibration(Vector3[] points = null, System.Action<bool> resultCallback = null)

Q: Как мне это кодировать, чтобы использовать логическое значение resultCallback для изменения сцены? Пока что он пишет в консоль, каким бы ни был результат, но мне не нужен этот вывод, если я могу заставить его автоматически менять сцену.

Я не очень опытен в C#.

Я пробовал следующее, но, конечно, это не работает:

private void Update()
        {
            if (Input.GetKeyDown(_startKey))
            {
                var calibrationStartResult = StartCalibration(
                    resultCallback: (calibrationResult) =>
                        Debug.Log("Calibration was " + (calibrationResult ? "successful" : "unsuccessful"))
            if (calibrationResult == true)
            {
                SceneManager.LoadScene("MainScene");
            }
                );

                Debug.Log("Calibration " + (calibrationStartResult ? "" : "not ") + "started");
            }
        }

1 Ответ

2 голосов
/ 14 февраля 2020

У вас почти было это - ключ должен определить второе свойство уровня класса, которое сохраняет локальное значение. Обратите внимание, я переименовываю calibrationResult в calibrated для простоты использования. Попробуйте:

bool calibrated = false;
bool startedCalibration = false;

private void Update()
{
    if (Input.GetKeyDown(_startKey) && !startedCalibration)
    {
        startedCalibration = true;
        StartCalibration(
            resultCallback: (calibrated) =>
            {
                startedCalibration = false;
                print("Calibration was " + (calibrated ? "successful" : "unsuccessful");

                // Assign the local scope variable to the class property:
                this.calibrated = calibrated;
            }
        );
    }

    if (calibrated)
    {
        calibrated = false;
        SceneManager.LoadScene("MainScene");
    }
}

Другой способ добиться этого - просто позвонить SceneManager.LoadScene из области действия resultCallback. Это также сэкономит на повторной проверке bool calibrated внутри обновления. Хотя одиночная проверка обновлений не запаздывает, вы обычно хотите отслеживать, сколько необходимых и ненужных вещей вы делаете в этих вечных циклах. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...