Unity集成Firebase实时数据库:游戏启动时如何读取数值数据?
Firebase Realtime Database读取问题排查建议(Unity Android游戏)
问题场景
开发Android平台第一人称3D游戏,使用Firebase Realtime Database存储数据,需求是游戏启动时读取根节点下room_timer→time_value的数值(2400秒),赋值给变量用于运行计时器。数据库仅包含该键值对,但以下代码未实现预期效果,需针对DataSnapshot及代码逻辑排查问题。
现有代码
public void ReadTimeValue() { Debug.Log("read db function start"); dbReference.GetValueAsync() .ContinueWithOnMainThread( Task => { if (Task.IsFaulted){ Debug.Log("problem"); } else if (Task.IsCompleted){ DataSnapshot snapshot = Task.Result; Debug.Log(snapshot.Child("room_timer").Child("time_value").Value); time_value = (float)snapshot.Child("room_timer").Child("time_value").Value; Debug.Log("db import " + time_value); } }); Debug.Log("read db function end"); }
排查建议
1. 确认数据库引用路径正确性
- 打印
dbReference的实际路径,验证是否指向数据库根节点:
如果Debug.Log("DB Reference Path: " + dbReference.Path);dbReference指向了子节点,那么Child("room_timer")会找不到目标数据。
2. 排查DataSnapshot读取有效性
- 在
Task.IsCompleted分支中,先打印完整快照内容,确认是否成功读取到数据:Debug.Log("Full Snapshot Data: " + snapshot.Value);- 若输出为
null或空,优先检查数据库权限规则(开发阶段可临时设置为公开读写测试:{ "rules": { ".read": true, ".write": true } }),同时确认设备网络正常。
- 若输出为
- 严格核对节点名称:Firebase节点大小写敏感,确保数据库中节点名是
room_timer和time_value,与代码中拼写完全一致。 - 检查数据类型匹配:
- 若数据库中
time_value存储为字符串类型,直接强制转换float会报错,需先转字符串再解析:string timeStr = snapshot.Child("room_timer").Child("time_value").Value.ToString(); time_value = float.TryParse(timeStr, out float result) ? result : 0f; - 建议数据库中直接存储数字类型(整数2400),避免类型转换问题。
- 若数据库中
3. 修复异步逻辑问题
ContinueWithOnMainThread是异步回调,代码中Debug.Log("read db function end");会先于回调执行,不要以此判断读取完成。计时器逻辑必须在time_value赋值完成后再启动(可在回调内调用计时器初始化方法)。- 优化错误日志,打印具体异常信息,方便定位问题:
if (Task.IsFaulted){ Debug.LogError("DB Read Failed: " + Task.Exception); }
4. 变量作用域验证
- 确认
time_value是类的成员变量(而非局部变量),否则回调内的赋值无法被外部代码访问。 - 确保挂载该脚本的GameObject在游戏启动时处于激活状态,未被销毁。
内容的提问来源于stack exchange,提问作者Shai Segal
相关产品推荐
相关产品推荐

