Как вызвать метод и вернуть его значение с UnityPlayer.UnitySendMessage

Как я могу вызвать этот метод C# из Java, а затем вернуть строковое значение?

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

Вот что я попробовал:

String str = UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");

Я получаю ошибку ниже

String str=UnityPlayer.UnitySendMessage("ProfileSave", "getTest","");                                 
^
 required: String  
 found:    void

2 ответа

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#. Просто убедитесь, что вы звоните sendResultToJava функция в конце функции C#, как мы делали в testFunction функция, если вы хотите, чтобы она возвращала значение.

UnitySendMessage не может ничего вернуть Android.

Один из способов сделать это - реализовать в Android другой метод, в который Unity будет возвращать значение по запросу.

Так, например, сначала в Android вы запрашиваете данные:

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

В единстве у вас есть метод, который получает этот запрос и отправляет данные обратно на 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);
}

Тогда в Android у вас есть метод, ожидающий получения данных (скорее всего, статический метод):

public static void ReceiveData(string data){
     //do stuff with data
}
Другие вопросы по тегам