yukinobe’s blog

アプリ開発、パソコン、スマホ等の技術的な雑記

Unityでの理不尽な動作

プログラマーならあるあるだと思いますが、どう考えても正しくない、おかしな動作をするときってありますよね?

そんな現象の解決に余裕で2,3日の時間を取られたり…

まあ、そんな現象に出くわしたので、もうこれ見てくださいよ!って愚痴です。

UnityでFirebaseを使用してログイン処理後に動きなのですが、メンバ変数 ret にログイン成否のステータスを渡して呼び元に返そうという処理ですが、 なぜか ret = "success" だけ値が設定されません。というか、確認したらコード自体が実行されていませんでした。

// ログイン処理
    public Task SignIn(string id, string pw)
    {
        ret = null;
        auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

        Task taskFirebase = 
                auth.SignInWithEmailAndPasswordAsync(id, pw).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                Debug.Log("TokenAsync was canceled.");
                ret = "cancel";
                return;
            }

            if (task.IsFaulted)
            {
                Debug.Log("TokenAsync encountered an error");
                ret = "fault";
                return;
            }

            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})",
                                          newUser.DisplayName, newUser.UserId);
            ret = "success";    // ← このコードがそもそも実行されない。
            return;
        });

        Debug.Log("SignIn() End.");
        return taskFirebase;

    }

それなのに、順番を上に持ってきただけで ret = "success" が実行されました。

            ret = "success";    // ← 位置を上に持ってきたら実行された。
            Firebase.Auth.FirebaseUser newUser = task.Result;
            Debug.LogFormat("User signed in successfully: {0} ({1})",
                                          newUser.DisplayName, newUser.UserId);
            return;

まあ、こんな問題に対処するのに軽く3日ですよ…

だって、理屈的にはこんなことあり得ないですから。

ただ、ビルドして実機で実行したときには想定通りの動きをしていたので、Unity IDE 上での実行だからという可能性は高いです。

きっと、Firebaseのログイン処理が非同期であることも妖しい動きを誘発しているとは思いますが。

ブログのネタにでもしないとやってられません。