如何从Unity,C#推送(附加)Firebase实时数据库中的列表?
所以,我想在Firebase实时数据库中存储播放器的清单。 我建立了一个基本的模式,我想在目录“branch”下添加项目(实际上是它们的名称)。 我正试图用推的方法来做,但它现在对我不起作用 我得到了下面的脚本,该脚本更新了播放器的清单客户端,并且应该将数据库更新到,并附加了清单“分支” 我做错了什么如何从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)
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;
}
}