[Unity3D]-Unity与Android交互

来源:互联网 发布:java变量定义规则 编辑:程序博客网 时间:2024/05/16 06:09

国产手机游戏都可以用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")