【问题标题】:How to call method and return its value with UnityPlayer.UnitySendMessage如何使用 UnityPlayer.UnitySendMessage 调用方法并返回其值
【发布时间】:2017-02-18 14:01:33
【问题描述】:

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

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

这是我尝试过的:

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

我收到以下错误

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

【问题讨论】:

  • 什么是 ProfileSave?
  • 它的游戏对象...
  • 使getTest 无效并将其作为void 函数调用。让我知道这是否有效
  • 但我需要统一返回值作为字符串
  • 我删除了 String str= 并尝试工作没有错误..但是现在我怎样才能获得价值?

标签: android unity3d unityscript unity5


【解决方案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# 函数。只要确保在 C# 函数的末尾调用 sendResultToJava 函数,就像我们在 testFunction 函数中所做的那样,如果你希望它返回值。

【讨论】:

  • 写c#代码时需要重新导出Unity项目吗?导出后在 Android 项目的任何地方都找不到 c# 文件。
  • @Faruk ?? C#代码应该在Unity项目中。你必须在添加上面的C#代码后重新导出Unity项目,否则Java端找不到它。此答案中的 Java 代码应在 Android 项目端创建。这里没什么复杂的......
  • 我不确定自己做错了什么,但我无法将消息从一个发送到另一个...
【解决方案2】:

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
}

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多