首页 > 解决方案 > 将 Firebase 数据从 Android 传递到 Unity3D

问题描述

因此,我成功地将普通字符串从 Android 传递到集成到我的本机应用程序中的 Unity。但是如何传递从 Firebase 获取的字符串?我知道 Firebase 是异步的,并且值不会在包含值事件侦听器的方法中返回。

我发现了这个堆栈溢出线程:

如何作为方法的结果返回 DataSnapshot 值?

但这涉及许多电话。我如何在 Unity 中处理它以获取该字符串?

我的 Unity 代码很简单:

void Start()
    {

        Text textCanvas = GameObject.Find("Canvas/Text").GetComponent<Text>();


        string user = AndroidOperations.ReturnString();


        Debug.Log("The message is "+ user);

    }


public static string ReturnString() {
        AndroidJavaObject unityPlayerClass = new AndroidJavaObject(pluginName);

        return unityPlayerClass.Call<string>("getUserId");
    }

正如您在上面看到的,我正在调用我的原生 Android 代码中的函数“getUserId”,其中包含一个值事件侦听器,该侦听器应该返回从 Firebase 获取的字符串。那么有什么办法可以做到这一点吗?如果是这样,我应该对我的 Unity 代码进行哪些更改?

标签: androidfirebaseunity3d

解决方案


您的代码建议您希望将当前用户的 ID 从 Android 本机应用程序传递回 Unity,这会更容易一些,因为当您在应用程序中设置身份验证时,Firebase 会缓存当前用户。在您的 Android 应用程序中获取当前用户 ID 如下所示:

public String GetCurrentUserID()
{
    return FirebaseAuth.getInstance().getCurrentUser().getUid();
}

要从该函数中取出字符串,在 Unity 中,您可以执行以下操作:

AndroidJavaObject unityPlayerClass = new AndroidJavaObject(pluginName);
Debug.Log(unityPlayerClass.Call<string>("GetCurrentUserId")); 

如果您的原生 Android 应用正在处理您的 Firebase 调用,并且您正试图从实时数据库中获取更复杂的数据,您应该设置一个处理程序以在您的原生应用中从您的请求中获取结果,然后将结果发送回 Unity从那里。

您链接的文章描述了如何在 Java 中从 Firebase 获取 DataSnapshot,唯一要添加的是使用DataSnapshot 中的值回调 Unity ,以及接收 Unity 内部值的函数。

本机应用程序中的 Java 代码可能类似于:

public void GetUserName(String uid) {
    databaseReference.child(String.format("users/%s/name", uid)).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Send the snapshot value, when received, back to Unity
            // "GameObject" should be the name of your gameObject in your active scene
            UnityPlayer.UnitySendMessage("GameObject", "ReceiveUserName", dataSnapshot.getValue(String.class));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

然后在 Unity 中你可以有一个方法ReceiveUserName

string userId;

void Start()
{
    Text textCanvas = GameObject.Find("Canvas/Text").GetComponent<Text>();
    RequestUserId();
}

// This doesn't return anything, it just sends the request out to the Android app
public void RequestUserId()
{
    AndroidJavaObject unityPlayerClass = new AndroidJavaObject(pluginName);
    unityPlayerClass.Call("GetUserId", userId);
}

// This gets called from the Android app, when the onDataChange listener is called.
public void ReceiveUserName(string name)
{
    Debug.Log("The message is " + name);
}

根据您在开发中所处的位置,您还可以考虑使用Firebase Unity SDK,它允许您直接从 Unity 进行 Firebase 调用。


推荐阅读