SceneManager.LoadScene не работает над разработкой мобильной сборки - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь построить игру Unity на android / iOS, проверив опцию разработки сборки (чтобы я мог использовать профилировщик для отладки), но функция SceneManager.LoadScene не работает. Я пробовал имя сцены и индекс в качестве параметров функции, но оба не работали.

Важно отметить, что игра отлично работает, если я уберу галочку с опции сборки сборки. В настоящее время я использую Unity 2019.3.5.f1.

enter image description here

Редактировать:
Я заметил, что сцена загружается без проблем, когда я запускаю SceneManager.LoadScene из функции Start(). Однако в большинстве частей моего кода я запускаю SceneManager.LoadScene из других функций, таких как обработчики событий.

Вот несколько примеров кода:

  1. Я запускаю эту функцию в Awake(). Достигает SceneManager.LoadScene("Credentials");, затем останавливается:
private void ConfirmGooglePlayerServicesRequirements()
    {
        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
            var dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available)
            {
                // Create and hold a reference to your FirebaseApp,
                // where app is a Firebase.FirebaseApp property of your application class.
                app = Firebase.FirebaseApp.DefaultInstance;

                InitializeFirebase();

                if (!signedIn)
                    SceneManager.LoadScene("Credentials");

            }
            else
            {
                Debug.LogError(System.String.Format(
                  "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                // Firebase Unity SDK is not safe to use here.
            }
        });
    }
Это функция Firebase, которая вызывается всякий раз, когда пользователь входит / выходит. Он вызывает событие с именем signedInEvent, которое обрабатывается функцией другого скрипта, который запускает SceneManager.LoadScene.
void AuthStateChanged(object sender, System.EventArgs eventArgs)
    {
        if (auth.CurrentUser != user)
        {
            signedIn = user != auth.CurrentUser && auth.CurrentUser != null;
            if (!signedIn && user != null)
            {
                Debug.Log("Signed out " + user.UserId);
            }
            user = auth.CurrentUser;
            if (signedIn)
            {
                Debug.Log("Signed in " + user.UserId);

                displayName = user.DisplayName ?? "";
                emailAddress = user.Email ?? "";
                userId = user.UserId ?? "";
                signedInEvent.Invoke(displayName, emailAddress, userId);
            }
        }
    }

Примечания:

  • Scenes / FirstScene включен. Он был отключен, когда я сделал снимок экрана выше, потому что я проводил некоторые тесты.
  • Я получил эту ошибку, используя adb (android debug bridge) некоторое время go, когда я запускал игру в режиме разработки. Это может быть связано с этой проблемой: FindGameObjectWithTag can only be called from the main thread

Спасибо!

1 Ответ

1 голос
/ 16 марта 2020

FindGameObjectWithTag может вызываться только из основного потока

Это действительно связано! Теперь, когда вы опубликовали свой код:

ContinueWith может быть вызвано в фоновом потоке. Большая часть Unity API может вызываться только из основного потока 1009 *, в противном случае он может либо отображать ошибку, такую ​​как упомянутая вами, либо иногда просто молча сбоить.


В общем это часто решается чем-то вроде, например, UnityMainThreadDispatcher .

Однако специально для Firebase уже существует расширение с именем ContinueWithOnMainThread в пространстве имен Firebase.Extensions, которое делает убедитесь, что код обратного вызова действительно выполняется в главном потоке, где работает API Unity.

Методы расширения для System.Threading.Tasks.Task и System.Threading.Tasks.Task<T>, которые позволяют выполнять функцию продолжения в главном потоке в Unity ,

using Firebase.Extensions;

private void ConfirmGooglePlayerServicesRequirements()
{
    Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
        var dependencyStatus = task.Result;
        if (dependencyStatus == Firebase.DependencyStatus.Available)
        {
            // Create and hold a reference to your FirebaseApp,
            // where app is a Firebase.FirebaseApp property of your application class.
            app = Firebase.FirebaseApp.DefaultInstance;

            InitializeFirebase();

            if (!signedIn)
            {
                SceneManager.LoadScene("Credentials");
            }
        }
        else
        {
            Debug.LogError($"Could not resolve all Firebase dependencies: {dependencyStatus}", this);
            // Firebase Unity SDK is not safe to use here.
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...