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

如何从Unity,C#推送(附加)Firebase实时数据库中的列表?,c#,firebase,unity3d,firebase-realtime-database,C#,Firebase,Unity3d,Firebase Realtime Database,所以,我想在Firebase实时数据库中存储播放器的清单。 我建立了一个基本的模式,我想在目录“branch”下添加项目(实际上是它们的名称)。 我正试图用推的方法来做,但它现在对我不起作用 我得到了下面的脚本,该脚本更新了播放器的清单客户端,并且应该将数据库更新到,并附加了清单“分支” 我做错了什么 public void pickUp() { Transform free_place = findFirstFreePlace(); if(free_place)

所以,我想在Firebase实时数据库中存储播放器的清单。 我建立了一个基本的模式,我想在目录“branch”下添加项目(实际上是它们的名称)。 我正试图用推的方法来做,但它现在对我不起作用

我得到了下面的脚本,该脚本更新了播放器的清单客户端,并且应该将数据库更新到,并附加了清单“分支”

我做错了什么

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;
        }
    }
public void picking(){
Transform free_place=findFirstFreePlace();
如果(免费位置){
对于(int i=0;i
我猜在这种情况下,
Push()
所做的事情有点混乱。如果你读了,上面写着:

添加到数据列表中。每次调用Push(),Firebase都会生成一个唯一的密钥,该密钥也可以用作唯一标识符,例如
用户分数//

基本上,它为您提供了一个可以安全写入的位置,而不是向数据库中实际添加某些内容。您应该查看,但我想我可以说明您打算做什么,以及如何为您的用例使用
Push()

public async void pickUp() {
    Transform free_place = findFirstFreePlace();
    if(free_place) {
        int lastIndex = 0;
        var elements = new List<string>();
        for (int i = 0; i < items.Length; i++) {
            if (free_place.name.Contains(i.ToString())) {
                items[i] = currentPickable;
                elements.Add(items[i].item_name);
                lastIndex = i;
            }
        }
        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;
    }
}
还有一些提示:

  • 我建议您尽可能使用侦听器来保持游戏状态与服务器状态同步。实时数据库将始终在后台异步运行,这样,当更多数据可用时,您可以帮助保持最新状态
  • 如果Unity中的异步编程对您来说是新的,请查看

    • 好吧,我终于明白了。 借助于
      Push()
      方法的唯一id生成,我能够将具有相同项目名称的子项添加到库存节点。 首先,我创建该唯一id,然后,我将该唯一id添加到数据库中,并将其值设置为项目名称

      编辑:我将我的原始解决方案与Pux0r3的解决方案混合使用,因此它使用异步/等待

      public async void pickUp() {
          Transform free_place = findFirstFreePlace();
          if (free_place) {
              int lastIndex = 0;
              var elements = new List<string>();
              for (int i = 0; i < items.Length; i++) {
                  if (free_place.name.Contains(i.ToString())) {
                      items[i] = currentPickable;
                      elements.Add(items[i].item_name);
                      lastIndex = i;
                  }
              }
              string key = reference.Child(auth.CurrentUser.UserId).Child("inventory").Push().Key;
              await reference.Child("users").Child(auth.CurrentUser.UserId).Child("inventory").Child(key).SetValueAsync(currentPickable.item_name);
              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;
          }
      }
      
      public异步无效拾取(){
      Transform free_place=findFirstFreePlace();
      如果(免费位置){
      int lastIndex=0;
      var elements=新列表();
      对于(int i=0;i
      这让我有点困惑。
      =>
      部分给出了以下错误:
      并非所有代码路径都在lambda表达式中返回'Func'类型的值
      我忘记添加
      返回值
      。对此很抱歉,正如我所说,我是从内存中完成的:-/运行游戏后,它会给我以下错误:
      ArgumentException:无效的类型System.Linq.Enumerable+SelectEnumerableIterator
      2[Item,System.String]转换为Variant`我意识到where注释无论如何都是错误的。给我一点时间。即使我弄乱了确切的语法,我认为这更容易理解。
      public async void pickUp() {
          Transform free_place = findFirstFreePlace();
          if (free_place) {
              int lastIndex = 0;
              var elements = new List<string>();
              for (int i = 0; i < items.Length; i++) {
                  if (free_place.name.Contains(i.ToString())) {
                      items[i] = currentPickable;
                      elements.Add(items[i].item_name);
                      lastIndex = i;
                  }
              }
              string key = reference.Child(auth.CurrentUser.UserId).Child("inventory").Push().Key;
              await reference.Child("users").Child(auth.CurrentUser.UserId).Child("inventory").Child(key).SetValueAsync(currentPickable.item_name);
              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;
          }
      }