|
我们在Unity项目的开发中很经常会需要在Unity中使用Android相关的功能,那如何才能正常的相互之间的进行调用呢?且看下文
1.Unity调用Android
1、普通类静态方法的调用,使用AndroidJavaClass
//创建类的引用
AndroidJavaClass ajc = new AndroidJavaClass("需要调用的方法所在的类");
//使用创建的类进行调用
ajc.CallStatic("方法名", {参数数组});
//如果调用的方法包含返回值
ajc.CallStatic<返回值的类型>(&#34;方法名&#34;, {参数数组})
2、普通类的实例方法调用,使用AndroidJavaObject
//创建类的对象
AndroidJavaObject ajo = new AndroidJavaObject(&#34;类全名&#34;);
//调用方法类似于静态方法 但有所不同
ajo.Call(&#34;方法名&#34;,{参数数组});
//带返回值
ajo.Call<返回的类型>(&#34;方法名&#34;,{参数数组})上边的这两个在大多数情况下已经可以满足我们基础的使用,但是有一些情况下,比如说 给定的一个方法所需要的参数类型并不是C#中已经有的类型。在这种情况下我们应该怎么 调用呢?举个栗子,在我们登录微信的时候我们需要获得微信sdk的回调,微信的接口已 经固定好了,你需要传一个实现了ILoginCallBack接口的类,在这种情况下,我们没有办法 直接在Adnroid中创建这个类,那怎么办呢?Unity为我们提供了一个叫做 AndroidJavaProxy的类,我们可以通过继承这个类然后重新写其构造函数并将传入ILoginCallBack的完整路径,并在这个类中实现ILoginCallBack的方法即可。
public class WeLoginAndroidAdapter : AndroidJavaProxy, ILoginCallBack
{
public WeLoginAndroidAdapter() : base(WeShareDefine.ModooShareCallbackInteface)
{
}
public event Action<string> OnLoginSuccess;
public event Action<string> OnLoginCancle;
public event Action<string> OnLoginFailed;
public void loginSuccess(string info)
{
if (OnLoginSuccess != null)
{
OnLoginSuccess.Invoke(info);
}
}
public void loginCancel(string result)
{
if (OnLoginCancle != null)
{
OnLoginCancle.Invoke(result);
}
}
public void loginFailed(string result)
{
if (OnLoginFailed != null)
{
OnLoginFailed.Invoke(result);
}
}
}这个时候我们可以实例化出来一个WeLoginAndroidAdapter的实例对象作为方法的参数传入调用,当登录的一些会回调调用的时候 ,就可以直接调用我们创建这个类实现的方法。当然实现的方法的名必须保持一致。
这个时候你可能会想到,如果说我需要传入的那个类型是一个正常的类呢?别急,回想一下,我们之前在调用的Unity的实例方法的时候,可是有创建过AndroidJavaObject,这个时候我们同样可以创建一个类的对象,然后作为参数传入,但这种情况并不常见。代码就不贴了,有兴趣的可以自己尝试一下调用。
再等等,有时候我们需要传入并不是一个类型,而是一个枚举,这种情况下要怎么办?其实是一样的,在Unity中,Android不管是类还是枚举,我们都可以通过使用AndroidJavaClass和AndroidJavaObject来使用。比如说,java中有这样一个枚举 LoginPlatform
package com.test.login
public enum LoginPlatform{
WeChat,
QQ,
Weibo;
}
这个时候呢,我们可以在Unity中,用AndroidJavaClass来创建出这个枚举的引用。
AndroidJavaClass ajc = new AndroidJavaClass(&#34;com.test.login.LoginPlatform&#34;)
AndroidJavaObject loginP = ajc.CallStatic<AndroidJavaObject>(&#34;WeChat&#34;)上边就是我们应该如何使用Unity来创建java代码中的枚举。
2、安卓调用Unity方法
Unity为我们提供了一个实现方式,通过SendMessage()的方式调用Unity场景中物体上挂载了某一个脚本的某一个方法。这种方式存在一定的局限性,首先必须是一个MonoBehaviour的脚本,其次还得场景中挂载着。
这个时候,我们可以通过Unity注册Android方法回调的方式来解决这一问题,怎么办呢,首先我们基于AndroidJavaProxy实现一个Java类,这个Java类提供了一系列的方法接口,那么我们在Unity中实现的类,就是这个类的一个C#实现。我们可以通过创建C#,来变相创建出一个Java类
package com.test.acallu
public interface ITest
{
void OnLogEnable(boolean logenable)
void OnShowPic()
}
public class TestClick(){
public void addListener(ITest lis){
}
}
public class Test: AndroidJavaProxy
{
public Test() : base(com.test.acallu.ITest)
{
}
void OnLogEnable(boolean logenable){}
void OnShowPic(){}
}
可以基于此种思路进行一系列的扩展,能够十分方便的完成Unity和安卓的对接,在接入第三方SDK时,如果对方未提供Unity版本的接入方法,我们就可以通过使用这种方式进行开发。
结束! |
|