Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unity Editor Freezes on Reloading Assemblies (2019.2.01f, Firebase 6.3.0) #449

Closed
staythirsty90 opened this issue Aug 17, 2019 · 1 comment

Comments

@staythirsty90
Copy link

staythirsty90 commented Aug 17, 2019

Unity will refresh and occasionally place unity in a state that would cause it to freeze if I reload assemblies by entering play mode or compiling a script

I noticed in the unity console these two messages:

Listen at Leaders failed: Permission denied
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogWarning(Object)
Firebase.Platform.FirebaseLogger:LogMessage(PlatformLogLevel, String) (at Z:\tmp\tmp.SOETccsZXr\firebase\app\client\unity\src\Unity\FirebaseLogger.cs:76)
Firebase.LogUtil:LogMessage(LogLevel, String) (at Z:\tmp\tmp.HzqjZMMOFf\firebase\app\client\unity\proxy\LogUtil.cs:62)
Firebase.LogUtil:LogMessageFromCallback(LogLevel, String) (at Z:\tmp\tmp.HzqjZMMOFf\firebase\app\client\unity\proxy\LogUtil.cs:70)
 
(Filename: Z:/tmp/tmp.SOETccsZXr/firebase/app/client/unity/src/Unity/FirebaseLogger.cs Line: 76)

This client does not have permission to perform this operation.
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogError(Object)
UIHandler:OnValueChanged(Object, ValueChangedEventArgs) (at Assets\Scripts\UI\UIHandler.cs:116)
Firebase.Database.Internal.<OnCancelledHandler>c__AnonStorey1:<>m__0() (at Z:\tmp\tmp.kBuvbLryUE\firebase\database\client\unity\proxy\InternalValueListener.cs:58)
Firebase.ExceptionAggregator:Wrap(Action) (at Z:\tmp\tmp.SOETccsZXr\firebase\app\client\unity\src\Platform\ExceptionAggregator.cs:98)
Firebase.Database.Internal.InternalValueListener:OnCancelledHandler(Int32, Error, String) (at Z:\tmp\tmp.kBuvbLryUE\firebase\database\client\unity\proxy\InternalValueListener.cs:51)
Firebase.AppUtilPINVOKE:PollCallbacks()
Firebase.AppUtil:PollCallbacks() (at Z:\tmp\tmp.HzqjZMMOFf\firebase\app\client\unity\proxy\AppUtil.cs:32)
Firebase.Platform.FirebaseAppUtils:PollCallbacks() (at Z:\tmp\tmp.HzqjZMMOFf\firebase\app\client\unity\proxy\FirebaseAppUtils.cs:17)
Firebase.Platform.FirebaseHandler:Update() (at Z:\tmp\tmp.SOETccsZXr\firebase\app\client\unity\src\Unity\FirebaseHandler.cs:189)
Firebase.Platform.FirebaseEditorDispatcher:Update() (at Z:\tmp\tmp.SOETccsZXr\firebase\app\client\unity\src\Unity\FirebaseEditorDispatcher.cs:86)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions() (at C:\buildslave\unity\build\Editor\Mono\EditorApplication.cs:303)
 
(Filename: Assets/Scripts/UI/UIHandler.cs Line: 116)

Once I see these messages I know that I must close Unity otherwise entering play mode or making any edits to my scripts would cause Unity to freeze. The last message in the editor log is:

Begin MonoManager ReloadAssembly

I imagine I implemented Auth & Database incorrectly:

using Firebase;
using Firebase.Auth;
using Firebase.Database;
using Firebase.Unity.Editor;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIHandler : MonoBehaviour {

    public Text text;
    FirebaseAuth auth;
    FirebaseUser user;
    DatabaseReference reference;
    ArrayList leaderBoard;
    private const int MaxScores = 5;
    private int score = 0;
    private uint currentCoins = 0;
    public delegate void ShowLeaderboardHandler(ArrayList leaderboard);
    public event ShowLeaderboardHandler OnShowLeaderboard;

    DependencyStatus dependencyStatus = DependencyStatus.UnavailableOther;

    string databaseName = "Leaders";

    void OnDestroy() {
        Debug.Log("UIHANDLER ON DESTORY");
        auth.StateChanged -= AuthStateChanged;
        auth = null;
        user = null;
        FirebaseDatabase.DefaultInstance.GetReference(databaseName).ValueChanged -= OnValueChanged;
    }

    void Start() {
        leaderBoard = new ArrayList();
        leaderBoard.Add("Firebase Top "   MaxScores.ToString()   " Scores");

        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
            dependencyStatus = task.Result;
            if (dependencyStatus == DependencyStatus.Available) {
                InitializeFirebaseAndLeaderboard();
            }
            else {
                Debug.LogError("Could not resolve all Firebase dependencies: "   dependencyStatus);
            }
        });
    }

    // Initialize the Firebase database:
    void InitializeFirebaseAndLeaderboard() {
        FirebaseApp app = FirebaseApp.DefaultInstance;
        app.SetEditorDatabaseUrl("https://xyz.firebaseio.com/");
        if (app.Options.DatabaseUrl != null)
        {
            app.SetEditorDatabaseUrl(app.Options.DatabaseUrl);
        }
        StartListener();
        auth = FirebaseAuth.DefaultInstance;
        auth.StateChanged  = AuthStateChanged;
        AuthStateChanged(this, null);
        reference = FirebaseDatabase.DefaultInstance.RootReference;
        if (user == null) {
            SigninAnonymously();
        }
    }

    protected void StartListener() {
        Debug.Log("START LISTENER");
        FirebaseDatabase.DefaultInstance
          .GetReference(databaseName).OrderByChild("score")
          .ValueChanged  = OnValueChanged;
    }

    void OnValueChanged(object sender2, ValueChangedEventArgs e2){
        if (e2.DatabaseError != null)
        {
            Debug.LogError(e2.DatabaseError.Message);
            return;
        }
        
        string title = leaderBoard[0].ToString();
        leaderBoard.Clear();
        leaderBoard.Add(title);
        if (e2.Snapshot != null && e2.Snapshot.ChildrenCount > 0)
        {
            foreach (var childSnapshot in e2.Snapshot.Children)
            {
                if (childSnapshot.Child("score") == null || childSnapshot.Child("score").Value == null)
                {
                    Debug.LogError("Bad data in sample.  Did you forget to call SetEditorDatabaseUrl with your project id?");
                    break;
                }
                else
                {
                    if (user.UserId == childSnapshot.Child("id").Value.ToString())
                    {
                        FindObjectOfType<Score>().LoadHighScore(int.Parse(childSnapshot.Child("score").Value.ToString()));
                    }
                    leaderBoard.Insert(1, childSnapshot.Child("score").Value.ToString());
                }
            }
        }
    }
             
    public void ShowLeaderboard() {
        Debug.Log("SHOW LEADERBOARD");
        OnShowLeaderboard?.Invoke(leaderBoard);
    }

    // Track state changes of the auth object.
    void AuthStateChanged(object sender, System.EventArgs eventArgs) {
        Debug.Log("AUTH STATE CHANGED");
        if (auth.CurrentUser != user) {
            bool signedIn = user != auth.CurrentUser && auth.CurrentUser != null;
            user = auth.CurrentUser;
            if (signedIn) {
                if (text) {
                    text.text = user.UserId;
                }
            }
        }
    }

    // Attempt to sign in anonymously.
    public void SigninAnonymously() {
        Debug.Log("SIGN IN ANONYMOUSLY");
        auth.SignInAnonymouslyAsync().ContinueWith(task => {
            if (task.IsCompleted && !task.IsCanceled && !task.IsFaulted) {
               // Debug.Log("User is now signed in.");
                user = task.Result;
            }
            else if (task.IsFaulted || task.IsCanceled) {
               // Debug.Log("User signin failed");
            }
        });
    }
 
    TransactionResult AddScoreToLeaderboardTransaction(MutableData mutableData) {
        Debug.Log("ADD SCORE TO LEADERBOARD TRANSACTION");
        List<object> leaders = mutableData.Value as List<object>;

        if (leaders == null) {
            leaders = new List<object>();
        }
        int index = -1;
        //int childScore;
        //int childCoins;
        for (int i = 0; i < leaders.Count; i  ) {

            var data = (Dictionary<string, object>)leaders[i];
            string id = (string)data["id"];
            if (id.Equals(user.UserId)) {
                int s = int.Parse(data["score"].ToString());
                if (s >= score) {
                    return TransactionResult.Abort();
                }
                index = i;
                break;
            }
        }
        if (index > -1) {
            leaders.RemoveAt(index);
            leaders.Add(new Dictionary<string, object> { ["id"] = user.UserId, ["score"] = score });
            mutableData.Value = leaders;
            return TransactionResult.Success(mutableData);
        }
        else {
            // user hasn't been on the leaderboard yet
            leaders.Add(new Dictionary<string, object> { ["id"] = user.UserId, ["score"] = score });
            mutableData.Value = leaders;
            return TransactionResult.Success(mutableData);
        }
    }

    public void AddScore(uint score) {
        this.score = (int)score;
        if (score == 0 ){//|| string.IsNullOrEmpty(email)) {
            return;
        }
        DatabaseReference reference = FirebaseDatabase.DefaultInstance.GetReference(databaseName);
        reference.RunTransaction(AddScoreToLeaderboardTransaction).ContinueWith(task => {
              if (task.Exception != null) {
                  //Debug.Log(task.Exception.ToString());
              }
              else if (task.IsCompleted) {
                  //Debug.Log("Transaction complete.");
              }
              else if (task.IsFaulted) {
                 // Debug.Log("Transaction cancelled.");
              }
          });
    }
}

Unity editor version: 2019.2.01f
Firebase Unity SDK version: 6.3.0 using Auth & Database
No additional SDKs
Windows 10
Targeting Android 4.1 (API 16), ARMv7, ARMv64, .NET 4.x, IL2CPP

I haven't tried to reproduce this issue with the Firebase Unity quickstarts but I have tried to re-import all the files without luck

@staythirsty90 staythirsty90 added the new New issue. label Aug 17, 2019
@staythirsty90 staythirsty90 changed the title Unity Editor freezes when entering play mode after being AFK for ~15 minutes (2019.2.01f, Firebase 6.3.0) Unity Editor Freezes on Reloading Assemblies (2019.2.01f, Firebase 6.3.0) Aug 19, 2019
@staythirsty90
Copy link
Author

This seems to be the same issue reported here #445

@stewartmiles stewartmiles added type: question and removed new New issue. labels Sep 19, 2019
@Binalkaseem1 Binalkaseem1 mentioned this issue Sep 20, 2019
@firebase firebase locked and limited conversation to collaborators Oct 23, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants