无法在Unity中使用Firebase运行RunTransaction

时间:2019-09-18 15:12:09

标签: unity3d firebase-realtime-database

我正在Unity中开发游戏,使用Firebase来存储用户和游戏数据。 将游戏保存到Unity一切都很好,但是在多人游戏中,我面临将开放游戏与唯一玩家2配对的挑战。 流程为: 1.您正在寻找状态为“开放”的游戏 2.如果在X秒内未找到游戏,则会创建一个状态为“打开”的新游戏

我有一个查询,返回开放游戏(状态为“开放”的游戏) 此查询已添加Firebase事件处理程序

public void OnButtonLookForOpenMPGames()
{
this.OpenFirebaseGamesAsHost = this.LiveGamereference.OrderByChild("State").EqualTo(WYMSettings.MP_GAME_STATE_OPEN_TO_PLAYER2)
                .LimitToFirst(3);

this.OpenFirebaseGamesAsHost.ChildAdded += this.OnOpenMPGameFound;
}

在处理程序中运行正常:

 private void OnOpenMPGameFound(object sender, ChildChangedEventArgs args)
    {
        Debug.Log("Looking for open games");

        if (args.DatabaseError != null)
        {
            // handle errors
        }
        else
        {
            Debug.Log("Open game found (it may be my own)");

            // remove event listener because we got a hit
            // it will fire as many times as it's true!
            this.OpenFirebaseGamesAsHost.ChildAdded -= this.OnOpenMPGameFound;

            if (args.Snapshot.Child("HostId").Value.ToString() != FirebaseAuth.DefaultInstance.CurrentUser.UserId)
            {
                Debug.Log("Other game than mine found open");

                // this.AddDelayedUpdateAction(() =>
                //      {
                //          this.MPGameLockInTransaction(args.Snapshot.Reference);
                //      });

                this.MPGameLockInTransaction(args.Snapshot.Reference);
            }
        }
    }

问题:处理程序将此传递给事务功能,但由于内部异常而失败(内部任务出错)-我尝试了许多不同的变体,但无法从Firebase官方示例中找出这一变体

问题代码: 我想要实现的是仅将游戏锁定到这两个玩家(在本示例中,主机和玩家2)查询开放游戏。 State是一个int,但这里是一个字符串,以示清楚。

 private void MPGameLockInTransaction(DatabaseReference mpreference)
    {
        mpreference.RunTransaction(mutableData => 
        {

                MultiPlayerGame transactionMPG = mutableData.Value as MultiPlayerGame;

                if (transactionMPG == null)
                {
                    return TransactionResult.Abort();
                } 

                if (transactionMPG.State != "open")
                {
                    // game is taken, abort
                    Debug.Log("transaction aborted");
                    return TransactionResult.Abort();
                }


                transactionMPG.State = "game started";

                mutableData.Value = transactionMPG;

            return TransactionResult.Success(mutableData);


        }).ContinueWith(task =>
        {
            if (task.Exception != null)
            {
                Debug.Log("Transactionlock to game failed" + task.Exception.ToString());
                // Look over again
                // not implemented yet
           }
            else
            {
                Debug.Log("starting game immediately");

                this.AddDelayedUpdateAction(() => this.StartMPGameImmediatelyFromSearch());

            }
        });
    }

1 个答案:

答案 0 :(得分:0)

这只是一个猜测,但可能与线程有关。

在较新的.Net版本中,ContinueWith可能会终止于可能无法调用大多数Unity API(包括Debug.Log)的线程上。

相反,您可以尝试使用ContinueWithOnMainThread中的extensions,而正是出于这个原因而创建的。{p>

  

在.NET 4.x运行时中,延续可能经常在后台执行,而此扩展方法会将其推送到主线程

     

.NET 3.x运行时不存在此问题,因为连续性包含在Parse库中,而隐式做到这一点。