Unity需要调用Android的功能主要涉及两种方式,一种是使用Android的插件,另一种是导出为GoogleAndroid 工程,进行处理。用途是使用第三方的插件 或者 接入渠道的SDK。
1:使用Android的插件处理。
具体过程,搜索引擎有很多结果,不再赘述。
主要要注意: 导出的jar的时候直接使用Eclipse中的export选项,选择src中的所有以及gen中的R.java即可。另外unity-classes.jar不需要再次包含。
当需要同时使用多个插件的时候:
AndroidManifest 中只能设置一个MainActivity,那么另一个插件的activity可以采用以下方式启动。
Untiy C#
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass jc2 = new AndroidJavaClass("com.foo.bar.Start");
jc2.CallStatic("StartIntent",jo);
Android Java
Class Start
{
public static void StartIntent(Activity main)
{
Intent intent = new Intent(main,AnotherMain.class)
main.StartActivtiy(intent);
}
}
//另一个插件的main activity
Class AnotherMain extends Activity
{
//...
}
2:导出为GoogleAndroid Project
projectSettings 中设置为导出android工程,导出后用Eclipse打开即可。
导出后src下有3个文件。
UnityPlayerAcitivity,UnityPlayerProxyActivity,UnityPlayerNativeActivtiy
前两个类都是不再使用了,直接继承自 UnityPlayerNativeActivity,在UnityPlayerProxyActivity中直接启动UnityPlayerNativeActivity.
都是让用户直接使用UtniyPlayerNativeActivity。
我的理解是用户的类继承自其中之一才能被AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 所获得。
官方的文档是要求继承自UnityPlayerActivity。
但是UnityPlayerActvtiy 其实有2份,一份在unity-classes.jar中,另一份就是src中。继承任何一份都可以使用。
差别就在于如果你需要接的sdk中包含有悬浮窗之类的工具时,继承自jar包中的无法修改,继承自src中的可以将
UnityPlayerNativeActivtiy extends NativeActivity
改为
UnityPlayerNativeActivtiy extends Activity 来使得悬浮窗可以获得点击事件。
另外修改AndroidManifest MainActivity(android.intent.action.MAIN)为自己需要的activity。导出时默认为UntiyPlayerNativtiActivtiy。
发现的问题:
用Eclipse运行或者打包安装程序apk时,在unity c#代码中的
#if UNTIY_EDITOR 是成立的。也就是说。需要把android执行的相关代码直接写而不是放在宏定义中。
我就是使用了 #if UNITY_EDITOR
#else
#endif 跳了坑。 这点待更新。
其实两种方式差别不是很大,可能写插件前者方便,接sdk后者方便。unity 调用 android 如果是static方法可以直接new class 然后callStatic,否则只能继承自UntiyPlayerActivity 来做。
Android调用Untiy使用 UnityPlayer.UnitySendMessage("GameObjectName","MethodName", "args");
三个参数分别是 脚本所在的物体名,方法名,参数。 unity处理。
public void MethodName(string message)
{
//to-do
}