如何在Unity中从C#推送(附加)Firebase实时数据库中的列表?

问题描述 投票:0回答:1

因此,我想将播放器的清单存储在Firebase实时数据库中。我建立了一个基本模式,我想在清单“分支”下添加项目(实际上是它们的名称)。我正在尝试使用push方法执行此操作,但是它现在对我不起作用。我得到了以下脚本,该脚本更新了播放器的库存客户端,并且应该将数据库更新为该脚本,并附加了库存“分支”。我在做什么错?

public void pickUp() {
        Transform free_place = findFirstFreePlace();
        if(free_place) {
            for (int i = 0; i < items.Length; i++) {
                if (free_place.name.Contains(i.ToString())) {
                    items[i] = currentPickable;
                    reference.Child("users").Child(auth.CurrentUser.UserId).Child("inventory").Child(items[i].item_name).Push();
                    lastIndex = i;
                }
            }
            free_place.GetChild(0).GetChild(0).GetComponent<Image>().sprite = items[lastIndex].item_pic;
            free_place.GetChild(0).GetChild(0).GetComponent<Image>().enabled = true;
            free_place.GetChild(1).GetComponent<Image>().enabled = true;
            free_place.GetChild(1).GetComponent<Button>().interactable = true;
        }
    }
c# firebase unity3d firebase-realtime-database
1个回答
0
投票

我猜想在这种情况下,Push()的功能有些混乱。如果您阅读documentation,它说:

添加到数据列表。每次调用Push()时,Firebase都会生成一个唯一密钥,该密钥也可以用作唯一标识符,例如user-scores/<user-id>/<unique-score-id>

基本上,它为您提供了一个可以安全地写入而不是向数据库中实际添加内容的地方。您应该检查一下sample,但是我想我可以说明您打算做的事情以及在您的用例中使用Push()的一种不错的方法。

public async void pickUp() {
    Transform free_place = findFirstFreePlace();
    if(free_place) {
        int lastIndex = 0;
        var itemNames = items
            .Where((item, index) => {
                lastIndex = index;
                free_place.name.Contains(index.toString())
            })
            .Select(item => item.item_name);
        await reference.Child("users").Child(auth.CurrentUser.UserId).Child("inventory").SetValueAsync(itemNames);
        free_place.GetChild(0).GetChild(0).GetComponent<Image>().sprite = items[lastIndex].item_pic;
        free_place.GetChild(0).GetChild(0).GetComponent<Image>().enabled = true;
        free_place.GetChild(1).GetComponent<Image>().enabled = true;
        free_place.GetChild(1).GetComponent<Button>().interactable = true;
    }
}

我在这里正在做的事是我事先建立了项目清单。然后,将清单条目设置为此列表。如果我依赖先前的状态,则可能更愿意将其作为事务来进行。

我也使用async / await。我不确定在更新游戏UI之前运行此逻辑有多重要,但是在Firebase中进行任何设置都是异步操作(它在后台运行)。如果您保持同步并不重要,则可以忽略此设置。

如果您想拥有唯一标识的武器插槽。您可以改为执行以下操作:

var childReference = reference.Child("users").Child(auth.CurrentUser.UserId).Child("inventory");
var key = childReference.Key;

// ... more logic here ...

childReference.Child(key).SetValueAsync(item_name);

更多提示:

  • 我建议您尽可能使用ValueChanged侦听器,以使游戏状态与服务器状态保持同步。实时数据库将始终在后台异步运行,这样,当有更多数据可用时,您可以帮助保持最新。
  • 如果您不熟悉Unity中的异步编程,请查看my post on the subject
  • 我在这里使用LINQ。在Unity中,它通常不被接受,而我是从内存中进行存储的,因此我的语法可能会略有偏离。在生产中使用它时要谨慎。我认为这样做比嵌套两个for循环更容易遵循我的示例逻辑!
© www.soinside.com 2019 - 2024. All rights reserved.