最近项目中碰到了需要加载模型到APP的需求。
经过调查,发现可以在app中加载一个Unity3D的模型来实现。
但是Unity3d导出的android项目是建立在Activity的基础上的,
我这个项目采用了嵌套fragment的结构,所以需要稍微修改一下。
问题解决步骤:
1)整合Unity3D与自己的Android项目。
2)把Activity显示的结构修改为Fragment内显示的结构。
3)做一些简单的事件操控。
大概demo的效果如图:
以上的问题其实网上都已经给出解决方法
请先参考这个地址
http://blog.csdn.net/jiguangcanhen/article/details/40150475
我主要在这边记录下以下我遇到的坑
1)强调:必须在Activity中初始化
初始化代码如下:
Constants.mUnityPlayer = new UnityPlayer(this);
int glesMode = Constants.mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
Constants.mUnityPlayer.init(glesMode, trueColor8888);
2)关于黑屏问题
这个原因是因为Unity3D没有正确初始化造成的
每次画面的切换(包括Activity)都会调用onResume,onWindowFocusChanged方法
所以在Activity必须要在这两个生命周期中对mUnityPlayer进行相应的操作
// Resume Unity
@Override protected void onResume()
{
super.onResume();
Constants.mUnityPlayer.resume();
}
// Notify Unity of the focus change.
@Override public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
Constants.mUnityPlayer.windowFocusChanged(hasFocus);
}
3)子fragment中要注意对mUnityPlayer的控制,mUnityPlayer只有pause,resume的操作
如果调用quit则直接关闭整个Activity
子fragment的实现代码
playerView = Constants.mUnityPlayer.getView();
if (playerView.getParent() != null) {
((ViewGroup) playerView.getParent()).removeAllViews();
}
layout.addView(playerView, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
Constants.mUnityPlayer.requestFocus();
操作事件的代码:
UnityPlayer.UnitySendMessage("Canvas/GameObject", "openWindow3","");
openWindow3就是Unity3d里面定义的事件
详细demo地址:
http://download.csdn.net/detail/wen3011/9796077
如果有什么问题,欢迎交流