所以我在一个场景中有一个玩家和一个敌人,当一个玩家移动时,它会以完美,快速和准确的位置更新Firebase。但是当为其他玩家更新敌人时,需要很长时间 敌人更新程序代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;
public class enemyUpdater : MonoBehaviour {
private DatabaseReference dataBase;
private bool gameStarted = false;
private float Z;
private float X;
// Use this for initialization
void Start () {
// Set up the Editor before calling into the realtime database.
FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("Not Showing This");
// Get the root reference location of the database.
dataBase = FirebaseDatabase.DefaultInstance.RootReference;
setup();
}
// Update is called once per frame
void FixedUpdate () {
this.gameObject.transform.position = new Vector3(X, this.gameObject.transform.position.y, Z);
}
void HandleU1XChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
string tmp = args.Snapshot.Value.ToString();
float.TryParse(tmp, out X);
}
void HandleU1ZChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
string tmp = args.Snapshot.Value.ToString();
float.TryParse(tmp, out Z);
}
void HandleU2XChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
string tmp = args.Snapshot.Value.ToString();
float.TryParse(tmp, out X);
}
void HandleU2ZChanged(object sender, ValueChangedEventArgs args)
{
if (args.DatabaseError != null)
{
Debug.LogError(args.DatabaseError.Message);
return;
}
string tmp = args.Snapshot.Value.ToString();
float.TryParse(tmp, out Z);
}
void setup()
{
if (multiSetup.isUserOne)
{
this.gameObject.transform.position = new Vector3(7.5f, this.gameObject.transform.position.y, -7.5f);
FirebaseDatabase.DefaultInstance
.GetReference("matches").Child("rooms").Child("room"+multiSetup.roomNum).Child("user2").Child("Xaxis")
.ValueChanged += HandleU1XChanged;
FirebaseDatabase.DefaultInstance
.GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user2").Child("Zaxis")
.ValueChanged += HandleU1ZChanged;
}
else if (!multiSetup.isUserOne)
{
this.gameObject.transform.position = new Vector3(-7.5f, this.gameObject.transform.position.y, 7.5f);
FirebaseDatabase.DefaultInstance
.GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user1").Child("Xaxis")
.ValueChanged += HandleU1XChanged;
FirebaseDatabase.DefaultInstance
.GetReference("matches").Child("rooms").Child("room" + multiSetup.roomNum).Child("user1").Child("Zaxis")
.ValueChanged += HandleU1ZChanged;
}
}
}
以下是行动中的GIF
以及延迟更新
https://drive.google.com/open?id=1tv4BCfVsV6AIjEiKE1Umj4FfIyy-AG-R
答案 0 :(得分:0)
本地客户端立即更新的原因是Firebase客户端立即触发本地写入操作的事件。
将其从一个播放器更改为另一个播放器的时间是它们各自与Firebase服务器的延迟以及发送和接收更改所需的带宽的组合。没有神奇的“让它更快”设置或代码来缩短那个时间,它只是通过云服务发送数据的现实。
Firebase客户端在本地执行的操作是隐藏网络现实的一种方法。各种游戏以各种方式处理这一现实。一些人根据他们最近所做的事情来预测敌人的未来行为,一些人将过去的行为表现为鬼魂,一些人将延迟纳入他们的游戏机制等等。