[Unity3D]-Unity与Android交互

国产手机游戏都可以用QQ登入或者微信登入游戏.QQ登入或者微信登入SDK功能的接入就会涉及到Unity 与Android或者IOS的交互…

Unity与Android交互

Android向Unity发送消息

在Android 项目中导入Unity的jar包,导入相关类后就可以通过#UnityPlayer.UnitySendMessage(var0,var1,var2) 调用Unity中已实现的方法..

var0 - 挂载脚本组件对象名gameObjectName;
var1 - 脚本组件中的方法名;
var2 - 方法参数


Unity调用Android中的代码

如果想获取应用包名即可如下写.

using ( AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
      AndroidJavaObject activity = player.GetStatic<AndroidJavaObject>("currentActivity");
       string packageName = activity.Call<string>("getPackageName");
}

AndroidJavaObject类中定义了所有调用android中代码的方法..

以下是android中的代码,最终导出jar包到Unity中调用..

public class MainActivity extends UnityPlayerActivity {
    public static MainActivity _instance;

    public static String GAMEOBJECTNAME;
    public static String PLUS_CALLBACK;
    public static String MINU_CALLBACK;
    public static String MYLTI_CALLBACK;

    public String _noStatic;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        _noStatic = "No Static";
        _instance = this;
    }

    public void Minu(float a, float b)
    {
        UnityPlayer.UnitySendMessage(GAMEOBJECTNAME, MINU_CALLBACK, String.valueOf(a - b));
    }

    //非静态
    public float Plus(float a, float b) {
        float res = a + b;
        UnityPlayer.UnitySendMessage(GAMEOBJECTNAME, PLUS_CALLBACK, String.valueOf(res));
        return res;
    }

    //静态
    public static float Multi(float a, float b) {
        float res = a * b;
        UnityPlayer.UnitySendMessage(GAMEOBJECTNAME, PLUS_CALLBACK, String.valueOf(res));
        return res;
    }
}

Unity调用Android代码

public class Test : MonoBehaviour
{
    AndroidJavaObject activity;
    string packageName;
    string a2u = "";
    string u2a = "";

    //#if UNITY_ANDROID && !UNITY_EDITOR
    void Awake()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        using (AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            activity = player.GetStatic<AndroidJavaObject>("currentActivity");
            packageName = activity.Call<string>("getPackageName");
            Debug.LogError("------->>>> AndroidJavaClass 执行");
        };

        //静态属性的设置
        activity.SetStatic<string>("GAMEOBJECTNAME", gameObject.name);
        activity.SetStatic<string>("PLUS_CALLBACK", "Anroid2Unity0");
        activity.SetStatic<string>("MINU_CALLBACK", "Anroid2Unity0");
        activity.SetStatic<string>("MYLTI_CALLBACK", "Anroid2Unity1");

        //静态属性的获取
        u2a += activity.GetStatic<string>("GAMEOBJECTNAME") + "\r\n";
        u2a += activity.GetStatic<string>("PLUS_CALLBACK") + "\r\n";
        u2a += activity.GetStatic<string>("MINU_CALLBACK") + "\r\n";
        u2a += activity.GetStatic<string>("MYLTI_CALLBACK") + "\r\n";
        //非静态属性的获取
        u2a += activity.Get<string>("_noStatic") + "\r\n";
#endif
    }

    public void JavaCall(string api, params string[] args)
    {
        using (AndroidJavaClass cls = new AndroidJavaClass(packageName + ".MainActivity"))
        {
            AndroidJavaObject jo = cls.GetStatic<AndroidJavaObject>("mInstance");
            jo.Call(api, args);
        }
    }

    public T JavaCall<T>(string api, params string[] args)
    {
        T res = default(T);
        using (AndroidJavaClass cls = new AndroidJavaClass(packageName + ".MainActivity"))
        {
            AndroidJavaObject jo = cls.GetStatic<AndroidJavaObject>("mInstance");
            res = jo.Call<T>(api, args);
        }
        return res;
    }

    public void Anroid2Unity0(string args)
    {
        a2u += "Android To Unity 0 : " + args + "\r\n";
    }
    public void Anroid2Unity1(string args)
    {
        a2u += "Android To Unity 1 : " + args + "\r\n";
    }

    public void Unity2Android(string args)
    {
        u2a += "Unity To Android : " + args + "\r\n";
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(0, 0, Screen.width, Screen.height * 0.1f), "Call Func"))
        {
            activity.Call("Minu", 10f, 2f);

            float res = activity.Call<float>("Plus", 10f, 2f);
            Unity2Android(res.ToString());
        }
        if (GUI.Button(new Rect(0, Screen.height * 0.1f, Screen.width, Screen.height * 0.1f), "Call Static Func"))
        {
            float res = activity.CallStatic<float>("Multi", 10f, 2f);
            Unity2Android(res.ToString());
        }
        a2u = GUI.TextArea(new Rect(0, Screen.height * 0.2f, Screen.width, Screen.height * 0.2f), a2u);
        u2a = GUI.TextArea(new Rect(0, Screen.height * 0.4f, Screen.width, Screen.height * 0.2f), u2a);
    }
}

如果在包下面还有其他路径的方法需要调用.例如:路径 com.example.calculate.push
Unity代码如下,其中packageName 获取方法上文中已提及

AndroidJavaClass cls = new AndroidJavaClass(packageName+".push")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值