You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:25:26