找回密码
 立即注册
查看: 323|回复: 0

Unity与安卓交互的基本使用

[复制链接]
发表于 2022-4-4 10:39 | 显示全部楼层 |阅读模式
我们在Unity项目的开发中很经常会需要在Unity中使用Android相关的功能,那如何才能正常的相互之间的进行调用呢?且看下文
1.Unity调用Android

1、普通类静态方法的调用,使用AndroidJavaClass
//创建类的引用
AndroidJavaClass ajc = new AndroidJavaClass("需要调用的方法所在的类");
//使用创建的类进行调用
ajc.CallStatic("方法名", {参数数组});
//如果调用的方法包含返回值
ajc.CallStatic<返回值的类型>("方法名", {参数数组})
2、普通类的实例方法调用,使用AndroidJavaObject
//创建类的对象
AndroidJavaObject ajo = new AndroidJavaObject("类全名");
//调用方法类似于静态方法  但有所不同
ajo.Call("方法名",{参数数组});
//带返回值
ajo.Call<返回的类型>("方法名",{参数数组})上边的这两个在大多数情况下已经可以满足我们基础的使用,但是有一些情况下,比如说 给定的一个方法所需要的参数类型并不是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("com.test.login.LoginPlatform")
AndroidJavaObject loginP = ajc.CallStatic<AndroidJavaObject>("WeChat")上边就是我们应该如何使用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版本的接入方法,我们就可以通过使用这种方式进行开发。

结束!
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 15:39 , Processed in 0.089980 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表