繁体   English   中英

将 Firebase 数据从 Android 传递到 Unity3D

[英]Pass Firebase data from Android to 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 代码中进行哪些更改?

您的代码表明您希望将当前用户的 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 调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM