最近这段时间涉及Unity3d和Android、iOS原生进行通信,初步的思想是把unity3d项目导出为ecplise或者As的lib工程,以减少Unity3d后期的修改对Android原生的结构造成影响,所以想作为子过程导入。在操作的过程中发现了很多的坑,直接以子过程的设想也并未坚持下去,而是加以改造为主工程的一个模块或者修改为一个子过程。(我写博客因为太懒不太喜欢截图,请读者见谅)
unity3d项目导出:从Unity3D导出来为ecplise的工程(如何从unity3d导出Android project不在此说明),导入cplise后出现如下几个问题:
a.src的文件夹是空的,Java文件存在java文件夹中
b.无libs文件夹及文件,部分的jar包和so文件在JniLibs里
c.style中涉及material design的属性,在ecplise版本里是不能使用的
d.在Androidmanifest中application中属性报错
解决方案:
a.src的文件夹是空的,把Java文件夹里的文件移到src里,删掉java文件夹
b.新建libs文件夹,将JniLibs中的文件复制到libs文件夹里,并从Unity3d的editor里拷贝classes.jar,从某个Android某个项目里拷贝v4包,jniLibs文件夹可删可不删
c.style中不能用的theme,可以删掉,可以修改为可用的parent theme
d.把Androidmanifest中application标签中属性去掉,包含banner,isGame、label、icon等标签全部去掉即可
经过上一步的操作,Unity3d的项目ecplise版本可以运行起来了。这是unity3d作为单独的项目在ecplise运行的。
下面说一下将可以运行的unity3d项目移植到现有的Android项目中:
1、引入classes.jar,unity3d主要的包
2、在要调用unity3d的页面中,继承UnityPlayerActivity,在oncreate中不能引用layout布局
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends UnityPlayerActivity {
private Boolean isStart=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Android发送数据给unity3d,
UnityPlayer.UnitySendMessage("moveplayer", "getSportData", "30");
}
//unity3d调用此方法,来获得是否开始的状态
public int isRunning(boolean isStart) {
ruturn isStart
}
}
3、将unity3d项目中的Androidmanifest文件,移植到Android项目的manifest中(详细移植不详细说明)
4、将assets里的文件全部复制到android项目中的assets文件夹,这个文件夹是unity3d的文件资源及代码文件
这样在最少的情况下将unitty3d的项目和原Android项目进行融合。以后unity3d的场景和规则发生改变的话,只需要替换assets文件夹即可,也便于做差分升级等。