2017-10-12 102 views
0

我尝试在android studio中制作插件以在Unity中使用。如何在Unity中使用Java插件

所以我在android studio中制作了这个方法。

public class MainActivity extends UnityPlayerActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    public static String SendMessage(){ 
     return "Message"; 
    } 



} 

和在Unity,

public class PluginWrapper : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 
     TextMesh textMesh = GetComponent<TextMesh>(); 
     var plugin = new AndroidJavaClass ("com.thewell_dev.beaconf.MainActivity"); 
     textMesh.text = plugin.CallStatic<string> ("ReturnMessage"); 

    } 

} 

使用sendMessage()方法在统一,使用AndroidJavaClass和CallStatic。

这是成功。

我可以通过统一检查设备中的消息。

但是,发生一个错误。

如果我改变这样的方法,

public class MainActivity extends UnityPlayerActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    public String SendMessage(){ 
     return "Message"; 
    } 



} 

变化的SendMessage方法类型(静态字符串字符串)

和在Unity,

public class PluginWrapper : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 
     TextMesh textMesh = GetComponent<TextMesh>(); 
     var plugin = new AndroidJavaClass ("com.thewell_dev.beaconf.MainActivity"); 
     textMesh.text = plugin.Call<string> ("ReturnMessage"); 

    } 


} 

变化plugin.CallStaic到插件.Call

如果我只是删除静态,但它不返回任何结果。

https://docs.unity3d.com/kr/current/ScriptReference/AndroidJavaClass.html

我只是改变类型。但没有回报。

我想我错由AndroidJavaClass通话方法,

,但我无法找到它。

如果你了解它,请帮助我。

+0

https://xinyustudio.wordpress.com/2015/12/31/step-by-step-指南为开发Android插件为unity3d-i/ – David

+0

https://stackoverflow.com/questions/27550280/unity-call-android-function-from-unity 这是我觉得有点similer你的问题。 你也可以添加一个调试语句来检查logcat中该函数是否被调用 –

+0

@David谢谢我试过了。 –

回答

1

您可以使用“类型”来调用静态方法,因为静态的东西被绑定到它们的定义类型。但是,您不能使用实例方法(即非静态方法),而不使用实例的类型。这就是为什么你的第二次尝试失败。要调用实例方法,你必须,无论是通过调用这样java的构造使一个自己拿到类型的实例:

var object = new AndroidJavaObject ("com.some.class", constructor_param1, constructor_param2, constructor_param3, ...); 
result = object.Call<string> ("SomeMethod"); 

或者,得到尽可能的像,其构造活动实例你的C#脚本的范围之外,可以使用静态方法来检索要查找的实例:

var type = new AndroidJavaClass ("com.some.class"); 
var object = type.CallStatic<AndroidJavaObject>("SomeStaticGetterMethod"); 
result = object.Call<string> ("SomeMethod");