新公司项目里有用到unity和android交互,记录下这些坑
unity导出android工程
图一的地方时包名需要一致,不然方法不生效
图二的是存储文件的位置,需要截图存取文件一定要注意路径是"storage/emulated/0/项目路径/video_20190423_114910.mp4"
****注意,unity碰到大的项目的时候,IOS和Andorid的生成项目会非常大,我们项目android10个G,IOS有30个G所以经常使用两个model来分别导出不同端,请注意,一定不能混着用,混着用的后果,ememememe,做好等一天的准备。
导出项目后,android端就是
把其中的
把上图的几个东西考到已有项目里就好了
implementation files('libs/unity-classes.jar')
然后就开始在activity里加东西
UnityPlayer mUnityPlayer = new UnityPlayer(this);
//setContentView(mUnityPlayer);
fl_bim.addView(mUnityPlayer);
mUnityPlayer.requestFocus();
实际上我们都会在页面加一个FrameLayout 来加载UnityPlayer
<FrameLayout android:id="@+id/fl_bim"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" android:orientation="horizontal"></FrameLayout>
注意,
这些生命周期必须跟着写,不然unityPlay不会生效。
坑1.unity初始化和加载模型,是占用主线程的,不可以使用dialog这种转圈方式,不然unity是不会继续任务
这时候需要在unity在初始化的时候加个图片,然后在初始化完成或者模型加载完毕后把这个图片移除。
坑2.unity在退出时,会调用mUnityPlayer.quit();quit()里又要调用kill()这个方法,会杀死当前进程,所以需要重写kill()阻止杀死。
但这也不能完全解决,还需要在AndroidManifest.xml里单独给activity开线程
unity和android交互方法比较固定
android调用unity的方法 mUnityPlayerUnitySendMessage(method, params1, params2..);
unity调用android:
#if UNITY_EDITOR Debug.Log("u_ISendCapture");
#elif UNITY_ANDROID
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("IGetCapture",data);
字母要大写要大写要大写
public void IGetCapture(String path){
Log.e("IGetCapture",path);
}
unity调到android的方法时,如果需要改变UI,需要使用
runOnUiThread(new Runnable() {
@Override public void run() {
}
});