Как вызвать метод и вернуть его значение с 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
}