现有的项目开发比较特殊,视图层(负责数据可视化)由unity开发,UI层/逻辑控制层由android开发
我们想实现两层开发分离,所以当初做了很多调研工作寻找一个可行的解决方案包括视频流,安卓打包出dll库进unity等
最后选择了用unity导出工程在androidstudio里作为一个mudule library被android工程引入依赖
具体实现思路是android工程中的mainActivity继承UnityPlayerActivity类使mainActivity可调用UnityPlayerActivity方法
因为遇到这个问题之后在网上查阅了很多资料,有类似方法的好像很少 ,可能是因为特殊需求把
所以需要自己写一篇笔记记录,自己每次项目更新打包的时候也要参考的
unity build settings:
(Export Project要打勾,如果不打勾打包出的是apk文件直接运行在设备上,打勾后导出的是可在android studio里面打开的工程文件)
点击export后:
1.如果遇到了using Engine.UI错误问题
解决方法:Assets->ReimportAll重新载入
2.遇到打包时LitJson.dll(第三方dll库文件)找不到的问题
解决方法:在unity视图里双击LitJson.dll文件,属性内把any platform选项打勾,inspector页面设置如下
1.Unity 导出Android Project后拿到在工程目录下的module文件夹**
2.在已有project中import module,将module改为library为项目添加依赖
3.在库文件夹下的java目录下的UnityPlayerActivity中的继承关系从 UnityPlayerActivity extends Activity改为UnityPlayerActivity extends
AppCompatActivity(在其build.gradle里添加api
‘com.android.support:appcompat-v7:27.1.1’)
使我们的主activity可以继承UnityPlayerActivity
4.工程内目录中,分别把库文件夹下jniLibs目录下的’armeabi-v7a’ 和 ‘x86’ 中的.so文件拷贝到avp目录下的同名文件夹中 同时在avp的build.gradle文件内defaultConfig下添加代码:
ndk {
abiFilters ‘armeabi-v7a’, ‘x86’
} 否则会引起app闪退问题**
5.同时在新添加的unity module的build.gradle文件内注释掉
aaptOptions {
noCompress = [’.unity3d’, ‘.ress’, ‘.resource’, ‘.obb’]
}
并且在该文件内将添加依赖的implement改为api,否则unity的class.jar文件不能被avp继承
6.然后应该就可以配置我们的avp项目了
其中还有修改引入module后的Manifest文件,引入android.support.v7.app.AppCompatActivity;等小问题应该都可以debug到了
*下面是我的项目中的一些备份文件,可供参考,但我觉得没多大意义,主要是我用来在项目中可以直接替换的,节省配置我这个项目的上述步骤的时间
unityview的Android Manifest文件备份(可直接替换)
这是修改后的在原avp中mainactivity中oncreat函数内容
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(null); // If activity relaunch, let everything restart from zero
setContentView(R.layout.activity_main);
mUnityPlayer = new UnityPlayer(this);
View playerView = mUnityPlayer.getView();
LinearLayout mLinearLayout =(LinearLayout)findViewById(R.id.mLinearLayout);
mLinearLayout.addView(playerView);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CODE_PERMISSION);
} else {
initializeHmiGlobal();
}
}
注释掉simulationFragment里的这段代码
// @Nullable
// @Override
// public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return inflater.inflate(R.layout.fragment_simulation, container, false);
// }**
avp下res\layout\activity_main布局文件如下
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:background="@color/colorPrimary"
android:padding=“1px”
tools:context=“com.xxx.avp.activity.MainActivity”>
*