我正在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());
}
});
}
答案 0 :(得分:0)
这只是一个猜测,但可能与线程有关。
在较新的.Net版本中,ContinueWith
可能会终止于可能无法调用大多数Unity API(包括Debug.Log
)的线程上。
相反,您可以尝试使用ContinueWithOnMainThread
中的extensions,而正是出于这个原因而创建的。{p>
在.NET 4.x运行时中,延续可能经常在后台执行,而此扩展方法会将其推送到主线程。
.NET 3.x运行时不存在此问题,因为连续性包含在Parse库中,而隐式做到这一点。