将Firebase数据从Android传递到Unity3D

将Firebase数据从Android传递到Unity3D,android,firebase,unity3d,Android,Firebase,Unity3d,因此,我成功地将普通字符串从Android传递到Unity,Unity集成到我的原生应用程序中。但如何传递从Firebase获取的字符串?我知道Firebase是异步的,并且该值不会在包含值事件侦听器的方法中返回 我发现这个堆栈溢出线程: 但这涉及许多电话。我如何在Unity中处理它以获得该字符串 我的统一代码很简单: void Start() { Text textCanvas = GameObject.Find("Canvas/Text").GetComponen

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

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

但这涉及许多电话。我如何在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");
    }
void Start()
{
Text textCanvas=GameObject.Find(“Canvas/Text”).GetComponent();
string user=AndroidOperations.ReturnString();
Log(“消息为”+用户);
}
公共静态字符串ReturnString(){
AndroidJavaObject unityPlayerClass=新的AndroidJavaObject(pluginName);
返回unityPlayerClass.Call(“getUserId”);
}

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

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

公共字符串GetCurrentUserID()
{
返回FirebaseAuth.getInstance().getCurrentUser().getUid();
}
要从该函数中提取字符串,请在Unity中执行以下操作:

AndroidJavaObject unityPlayerClass=新的AndroidJavaObject(pluginName);
Log(unityPlayerClass.Call(“GetCurrentUserId”);
如果您的本机Android应用程序正在处理Firebase呼叫,并且您正试图从实时数据库中获取更复杂的数据,那么您应该在本机应用程序中设置一个处理程序来获取请求的结果,然后将结果发送回Unity

您链接的文章描述了如何在Java中从Firebase获取DataSnapshot,唯一要添加的是一个包含DataSnapshot值的函数,以及一个在Unity中接收值的函数

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

public void GetUserName(字符串uid){
databaseReference.child(String.format(“users/%s/name”,uid)).addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
//收到快照值后,将其发送回Unity
//“GameObject”应该是活动场景中游戏对象的名称
UnityPlayer.UnitySendMessage(“游戏对象”、“接收用户名”、dataSnapshot.getValue(String.class));
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});
}
然后在Unity中,您可以有一个方法
ReceiveUserName

stringuserid;
void Start()
{
Text textCanvas=GameObject.Find(“Canvas/Text”).GetComponent();
RequestUserId();
}
//这不会返回任何内容,它只是将请求发送到Android应用程序
public void RequestUserId()
{
AndroidJavaObject unityPlayerClass=新的AndroidJavaObject(pluginName);
unityPlayerClass.Call(“GetUserId”,userId);
}
//当调用onDataChange侦听器时,将从Android应用程序调用此函数。
public void ReceiveUserName(字符串名称)
{
Log(“消息为”+名称);
}

根据您的开发情况,您还可以考虑使用,它允许您直接从Unity拨打Firebase电话。

谢谢您的回答,兄弟。我可以知道UnitySendMessage中的“GameObject”参数是什么吗?我应该按照您说的那样输入,还是应该在其中输入任何GameObject名称?是的,我曾想过为unity使用firebase,但由于我所有的数据都来自本机应用程序,我认为为unity创建另一个单独的firebase项目将变得多余。我会试试上面的方法,让你知道!兄弟,我按照你的步骤做了,但是我没有在我的日志猫的任何地方得到receiveUserId方法的调试消息。我现在该怎么办?同样在上面,你将getUserId的返回类型指定为String,但你没有返回任何内容?我添加了一点,以防你有不同的想法,并稍微修改了我的代码。很抱歉,我不再经常使用Java了。