Unity与Andriod的交互

Unity与安卓的信息交互


这次分享的不同于传统的方式AndroidJavaClass("com.unity3d.player.UnityPlayer")
如果是新手的话,请看 交互新手教程

在这里插入图片描述
在这里插入图片描述

这里讲的是在Unity中调用java代码,或者在unity中传参到java中,在Java代码中运行。

以下是在Java中的代码

public class UnitySdk {
    private final String TAG = "sdkcall";
    private static final class MInstanceHolder{
        static final UnitySdk mInstance = new UnitySdk();
    }
    public static UnitySdk getInstance() { return MInstanceHolder.mInstance; }
    private UnitySdk() {
        UnityPlayer mPlayer;
        try {
            ArrayList<Class<?>> clsList = new ArrayList<Class<?>>();
            Class<?> cls = UnityPlayer.currentActivity.getClass();
            clsList.add(cls);
            cls = cls.getSuperclass();
            while (cls != null) {
                clsList.add(cls);
                cls = cls.getSuperclass();
            }
            mPlayer = null;
            for (Class<?> c : clsList) {
                Field[] flds = c.getDeclaredFields();
                for (Field fld : flds) {
                    if (UnityPlayer.class.equals(fld.getType())) {
                        fld.setAccessible(true);
                        mPlayer = (UnityPlayer) fld.get(UnityPlayer.currentActivity);
                        break;
                    }
                }
            }
            OnInit();
        } catch (Throwable t) {
            Log.i(TAG, "mPlayer=" + t);
            return;
        }
        Log.i(TAG, "add mPlayer=" + mPlayer);
    }
    public Activity activity(){return UnityPlayer.currentActivity;}
    private void OnInit(){
        Log.i(TAG, "OnInit: 初始化成功");
    }

    public int Getint()
    {
        return 520;
    }
    public String Getstring()
    {
        return "这个是个字符串信息";
    }
    public void LogIntPram(int _int)
    {
        Log.i(TAG, "LogIntPram: "+_int);
        String str = Integer.toString(_int);
        Toast.makeText(activity(),str,Toast.LENGTH_LONG).show();
    }
    public void LogStringPram(String _str)
    {
        Log.i(TAG, "LogStringPram: "+_str);
        Toast.makeText(activity(),_str,Toast.LENGTH_LONG*2).show();
    }
}

构建一个UnitySdk,方便在Unity中调用,而不是使用Unity自带的UnityPlayer类,在构造函数函数中,调用com.unity3d.player.UnityPlayer。将UnitySdk至为单例类。可在函数中对其他的一些方法,或自定义方法调用。
*


Unity中设置

将Android studio中打好的jar包,加载到Unity中,路径为:Plugins/Android/libs
在这里插入图片描述
在这里插入图片描述
在Unity中,将调用java的方法统一管理到Sdkmgr中。

public class Sdkmgr : MonoBehaviour
{
    private static AndroidJavaObject mainObject;

    private static Sdkmgr instance = null;
    public static Sdkmgr Instance
    {
        get
        {
            if (instance == null)
            {
                instance = GameObject.Find("mgr").AddComponent<Sdkmgr>();
            }
            return instance;
        }
    }

    private void Awake()
    {
#if !UNITY_EDITOR && UNITY_ANDROID
        Debug.Log("调用Awake");
        var mainClass = new AndroidJavaClass("com.wzt.sdkcall.UnitySdk");
        mainObject = mainClass.CallStatic<AndroidJavaObject>("getInstance");
#endif
    }

    public int GetInt()
    {
#if UNITY_EDITOR
        return 0;
#elif UNITY_ANDROID
        return mainObject.Call<int>("Getint");
#endif
    }
    public string GetString()
    {
#if UNITY_EDITOR
        return "";
#elif UNITY_ANDROID
        return mainObject.Call<string>("Getstring");
#endif
    }

    public void LogInt(int num)
    {
        if (mainObject != null)
        {
            Debug.Log(num);
            mainObject.Call("LogIntPram", num);
        }
    }

    public void LogString(string str)
    {
        if (mainObject != null)
        {
            Debug.Log(str);
            mainObject.Call("LogStringPram", str);
        }
    }
}

在业务逻辑中调用代码:

 void OnbtnIntClick()
    {
        txtContent.text = Sdkmgr.Instance.GetInt().ToString();
    }
    void OnbtnStrClick()
    {
        txtContent.text = Sdkmgr.Instance.GetString();
    }
    void OnbtnLogintClick()
    {
        Sdkmgr.Instance.LogInt(89);
    }
    void OnbtnLogstrClick()
    {
        Sdkmgr.Instance.LogString("这是一掉信息的!");
    }

效果图

Demo演示


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gxy_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值