unity导入android工程实现unity和android开发分离

unity工程导入android project的一些配置)

    • (配置环境/须知/博客定位/目的)
    • 遇到的问题和解决方案
    • 具体实现过程

(配置环境/须知/博客定位/目的)

现有的项目开发比较特殊,视图层(负责数据可视化)由unity开发,UI层/逻辑控制层由android开发
我们想实现两层开发分离,所以当初做了很多调研工作寻找一个可行的解决方案包括视频流,安卓打包出dll库进unity等
最后选择了用unity导出工程在androidstudio里作为一个mudule library被android工程引入依赖
具体实现思路是android工程中的mainActivity继承UnityPlayerActivity类使mainActivity可调用UnityPlayerActivity方法

遇到的问题和解决方案

因为遇到这个问题之后在网上查阅了很多资料,有类似方法的好像很少 ,可能是因为特殊需求把
所以需要自己写一篇笔记记录,自己每次项目更新打包的时候也要参考的

具体实现过程

unity build settings:
(Export Project要打勾,如果不打勾打包出的是apk文件直接运行在设备上,打勾后导出的是可在android studio里面打开的工程文件)
unity导入android工程实现unity和android开发分离_第1张图片

点击export后:
1.如果遇到了using Engine.UI错误问题
解决方法:Assets->ReimportAll重新载入
2.遇到打包时LitJson.dll(第三方dll库文件)找不到的问题
解决方法:在unity视图里双击LitJson.dll文件,属性内把any platform选项打勾,inspector页面设置如下
unity导入android工程实现unity和android开发分离_第2张图片

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:app=“http://schemas.android.com/apk/res-auto”
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”>

    

    

    

        
    

    

        
    
*

你可能感兴趣的