因此,我想将播放器的清单存储在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;
}
}
我猜想在这种情况下,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);
更多提示: