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