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

use*_*589 7 android unity-game-engine unityscript unity5

如何从Java调用此C#方法然后返回字符串值?

public string getTest () { return "test"; }
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的:

String str = UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

String str=UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");                                 
^
 required: String  
 found:    void
Run Code Online (Sandbox Code Playgroud)

Pro*_*mer 5

UnityPlayer.UnitySendMessage是一个void函数,不返回值。看一下UnitySendMessageExtension下面的函数实现。它类似于Turnipinindia的答案,但返回一个值。它仅返回a,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
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

来自Java的用法:

String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore");  
Run Code Online (Sandbox Code Playgroud)

这将与任何C#函数一起使用。如果您希望它返回值,只需确保像在函数中一样sendResultToJava在C#函数的末尾调用函数testFunction即可。


小智 2

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

实现此目的的一种方法是在 Android 中实现另一种方法,Unity 将在请求时将值传回给该方法。

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

UnityPlayer.UnitySendMessage("ProfileSave", "getData");
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

然后在 android 中你有一个等待接收数据的方法(很可能是静态方法):

public static void ReceiveData(string data){
     //do stuff with data
}
Run Code Online (Sandbox Code Playgroud)