如何使用UnityPlayer.UnitySendMessage调用方法并返回其值

11

我该如何从Java中调用这个C#方法,然后返回字符串值?

public string getTest () { return "test"; }

这是我的尝试:

String str = UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");
我收到以下错误消息。
String str=UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");                                 
^
 required: String  
 found:    void

它是游戏对象... - user3855589
getTest 函数改为 void 类型,并作为 void 函数调用。如果可以,请告诉我是否有效。 - Programmer
但我需要从Unity返回字符串值。 - user3855589
我删除了“String str=”并尝试工作,没有错误...但现在的问题是如何获取值? - user3855589
@MXD,程序员:我可以使用共享首选项吗? - user3855589
显示剩余3条评论
2个回答

9

UnityPlayer.UnitySendMessage是一个 void 函数,不返回任何值。请看下面的 UnitySendMessageExtension 函数实现。它类似于 turnipinindia 的答案,但它返回一个值。它只返回一个 string,所以你需要将该字符串转换为你正在使用的变量类型。

Java

public final class MyPlugin
{
    //Make class static variable so that the callback function is sent to one instance of this class.
     public static MyPlugin testInstance;

     public static MyPlugin instance()
     {
         if(testInstance == null)
         {
             testInstance = new MyPlugin();
         }
         return testInstance;
     }

    string result = "";


    public string UnitySendMessageExtension(string gameObject, string functionName, string funcParam)
    {
        UnityPlayer.UnitySendMessage(gameObject, functionName, funcParam);
        string tempResult = result;
        return tempResult;
    }

    //Receives result from C# and saves it to result  variable
    void receiveResult(string value)
    {
        result = "";//Clear old data
        result = value; //Get new one
    }
}

C#:

class TestScript: MonoBehaviour
{
    //Sends the data from PlayerPrefs to the receiveResult function in Java
    void sendResultToJava(float value)
    {
        using(AndroidJavaClass javaPlugin = new AndroidJavaClass("com.company.product.MyPlugin"))
        {
             AndroidJavaObject pluginInstance = javaPlugin.CallStatic("instance");
             pluginInstance.Call("receiveResult",value.ToString());
        }
    }

    //Called from Java to get the saved PlayerPrefs
    void testFunction(string key)
    {
        float value = PlayerPrefs.GetFloat(key) //Get the saved value from key
        sendResultToJava(value); //Send the value to Java
    }
}

Java中的用法:

String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore");  

这将适用于任何 C# 函数。只需确保您在 C# 函数结尾处调用 sendResultToJava 函数,就像我们在 testFunction 函数中所做的那样,如果您希望它返回值。


当我编写C#代码时,是否需要再次导出Unity项目?导出后,在Android项目中找不到任何C#文件。 - Faruk
@Faruk 你需要将C#代码放入Unity项目中。在添加完上述C#代码后,你需要重新导出Unity项目,否则Java端无法找到它。这个答案中的Java代码应该在Android项目端创建。这里没有什么复杂的地方... - Programmer
我不确定我做错了什么,但我无法从一个发送消息到另一个... - Faruk

2

UnitySendMessage无法向Android返回任何内容。

您可以通过在Android中实现另一个方法来完成此操作,当Unity请求时,Unity将把值传回该方法。

例如,在Android中首先请求数据:

UnityPlayer.UnitySendMessage("ProfileSave", "getData");

在Unity中,你有一个方法来接收请求并将数据发送回Android:
public void getData () { 
    string dataString = "exampleData";
    //code to send data back to ReceiveData method in Android, something like this probably:
    AndroidJavaClass myAndroidClass = new AndroidJavaClass ("com.myCompany.myApplication.myClass");
    myAndroidClass.CallStatic ("ReceiveData",dataString);
}

在安卓中,你需要一个等待接收数据的方法(很可能是静态方法):
public static void ReceiveData(string data){
     //do stuff with data
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接