2016-10-10 4 views
3

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

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

Это то, что я пробовал:

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

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

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

Что такое ProfileSave? – Programmer

+0

его игровой объект ... – user3855589

+0

Сделайте 'getTest' void и назовите его как' void'. Дайте мне знать, если это работает – Programmer

ответ

0

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

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

Так, например, первый в андроида вы запрашиваете данные:

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 
} 
1

UnityPlayer.UnitySendMessage - это функция void и не возвращает значение. Взгляните на реализацию функции UnitySendMessageExtension ниже. Он похож на ответ turnipinindia's, но он возвращает значение. Он возвращает только 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# FUNC Тион. Просто убедитесь, что вы вызываете функцию sendResultToJava в конце функции C#, как мы это делали в функции testFunction, если вы хотите, чтобы она возвращала значение.

+0

Когда я пишу код C#, мне нужно снова экспортировать проект Unity? Я не могу найти файлы C# в любом месте проекта Android после экспорта. – Faruk

+0

@Faruk ?? Код C# должен быть в проекте Unity.Вам придется реэкспортировать проект Unity после добавления кода C# выше, иначе сторона Java не сможет его найти. Код Java из этого ответа должен быть создан на стороне Android Project. Ничего сложного здесь ... – Programmer

+0

Я не уверен, что я делаю неправильно, но я не могу отправить сообщение от одного к другому ... – Faruk

Смежные вопросы