在Unity中借助Firebase实时数据库检查用户名是否存在
Unity C# 检查Firebase实时数据库用户名是否存在的正确实现
你的代码存在几个关键问题,导致无法正确完成用户名存在性检查,以下是修正方案:
原代码的问题点
- 返回值错误:
IEnumerator不能直接返回bool,必须通过回调函数传递检查结果 - API调用错误:Firebase的
orderByChild和EqualTo方法会返回新的Query实例,不会修改原对象,必须保存这个新对象才能执行有效查询;另外C#中方法名大小写敏感,getChild要改成GetChild - 等待逻辑错误:没有发起实际的查询请求(需要调用
GetValueAsync()),仅等待IsCompleted没有意义 - 存在性判断错误:原代码判断
Usernames == null完全不成立,应该检查查询返回的DataSnapshot是否包含数据
修正后的完整代码
// 通过回调函数传递检查结果 private IEnumerator CheckUsernameExists(string _username, System.Action<bool> onCheckFinished) { // 构建查询:定位到usernames节点,按username字段匹配目标值 var usernameQuery = DBreference.RootReference.GetChild("usernames") .OrderByChild("username") .EqualTo(_username); // 发起异步查询请求 var queryTask = usernameQuery.GetValueAsync(); // 等待查询任务完成 yield return new WaitUntil(() => queryTask.IsCompleted); // 处理查询异常 if (queryTask.Exception != null) { Debug.LogError("用户名查询失败: " + queryTask.Exception.InnerException?.Message); onCheckFinished?.Invoke(false); yield break; } DataSnapshot resultSnapshot = queryTask.Result; // 快照存在数据则说明用户名已被占用 bool isUsernameTaken = resultSnapshot.Exists; // 通过回调返回结果 onCheckFinished?.Invoke(isUsernameTaken); }
调用示例
// 调用检查方法,通过回调获取结果 StartCoroutine(CheckUsernameExists("myTestUsername", (isTaken) => { if (isTaken) { Debug.Log("该用户名已存在,请更换"); } else { Debug.Log("用户名可用,可以注册"); } }));
内容的提问来源于stack exchange,提问作者harptom
相关产品推荐
相关产品推荐

