加快在Unity中获取Firebase值

时间:2017-12-31 00:22:44

标签: c# unity3d firebase-realtime-database

所以我在一个场景中有一个玩家和一个敌人,当一个玩家移动时,它会以完美,快速和准确的位置更新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

1 个答案:

答案 0 :(得分:0)

本地客户端立即更新的原因是Firebase客户端立即触发本地写入操作的事件。

将其从一个播放器更改为另一个播放器的时间是它们各自与Firebase服务器的延迟以及发送和接收更改所需的带宽的组合。没有神奇的“让它更快”设置或代码来缩短那个时间,它只是通过云服务发送数据的现实。

Firebase客户端在本地执行的操作是隐藏网络现实的一种方法。各种游戏以各种方式处理这一现实。一些人根据他们最近所做的事情来预测敌人的未来行为,一些人将过去的行为表现为鬼魂,一些人将延迟纳入他们的游戏机制等等。