Unity3D和Android相互通信的坑1

来源:互联网 发布:java二分递归 编辑:程序博客网 时间:2024/06/07 17:50

最近这段时间涉及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;@Overrideprotected 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文件夹即可,也便于做差分升级等。




原创粉丝点击