2016-10-10 9 views
3

JavaからこのC#メソッドを呼び出して文字列値を返す方法はありますか?メソッドを呼び出して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には何も返すことができません。

これを行う方法の1つは、Androidで要求されたときにUnityが値を渡すという別の方法を実装することです。

したがって、たとえば、最初のアンドロイドであなたは、データを要求:団結で

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

あなたがその要求を受信し、バックアンドロイドにデータを送信する方法があります:

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 
} 
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関数がtestFunction関数のように、C#関数の最後に関数を呼び出すようにしてください。

+0

私はC#コードを書くときUnityプロジェクトを再度エクスポートする必要がありますか?エクスポート後、AndroidプロジェクトのどこにでもC#ファイルが見つかりません。 – Faruk

+0

@ファルク? C#コードは、Unityプロジェクト内にある必要があります。上記のC#コードを追加した後で、Unityプロジェクトを再エクスポートする必要があります。そうしないと、Java側はそれを見つけることができません。この回答のJavaコードは、Androidプロジェクト側で作成する必要があります。ここで複雑なものはありません.... – Programmer

+0

私は何が間違っているのか分かりませんが、私はメッセージを1つから別のものに送ることはできません... – Faruk

関連する問題