实现Unity和Android进行交互.docx

上传人:b****5 文档编号:8373506 上传时间:2023-01-30 格式:DOCX 页数:6 大小:18.06KB
下载 相关 举报
实现Unity和Android进行交互.docx_第1页
第1页 / 共6页
实现Unity和Android进行交互.docx_第2页
第2页 / 共6页
实现Unity和Android进行交互.docx_第3页
第3页 / 共6页
实现Unity和Android进行交互.docx_第4页
第4页 / 共6页
实现Unity和Android进行交互.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

实现Unity和Android进行交互.docx

《实现Unity和Android进行交互.docx》由会员分享,可在线阅读,更多相关《实现Unity和Android进行交互.docx(6页珍藏版)》请在冰豆网上搜索。

实现Unity和Android进行交互.docx

实现Unity和Android进行交互

实现Unity和Android进行交互

1.背景

这里的实现是在Androidstudio2.2和Unity5.4上。

本人是Android开发者,因为公司的业务需求需要与unity进行对接。

那么暴露出来最需要解决的问题就是android上实现的方法和unity脚本上实现的方法如何进行相互的调用。

在解决该问题的过程中,找了很多的教程以及google了很多其中问题的解决方法。

下面就是我整理出来的一些操作步骤和问题的解决方式。

2Android上的操作

2.1新建Android项目

首先新建一个android项目,file-->new-->newproject,这里新建项目的名称为UnityAndroid,包名为cn.unity.android,一直点击next到finish就ok了。

新建android项目

然后将项目切换成project的格式,打开app目录下的build.gradle文件,将applyplugin:

'com.android.application',改成applyplugin:

'com.android.library',因为androidstudio只有在这种格式下才可以导出unity需要使用的aar或者jar文件。

然后删除defaultConfig下的applicationId,去掉默认的dependencies下的

compile'com.android.support:

appcompat-v7:

25.0.0'的引入,因为这里不需要用到它,而且这个包包含了很多的资源文件我们是用不到的,最后格式为。

build.gradle文件project格式

接下来我们需要修改AndroidManifest文件和res文件,首先删除values下的style.xml文件,因为这里面默认包含的是之前删除的com.android.support:

appcompat-v7:

25.0.0包里面的主题。

然后修改AndroidManifest文件中application下的theme为android自带的主题。

同时将修改为,防止在unity中导出的app与AndroidManifest中的包名不一致产生的问题。

然后添加信息,否则在Unity导出APK时会报找不到manifest文件的错误信息

android:

name="unityplayer.UnityActivity"android:

value="true"/>

最后得到的AndroidManifest和res的格式如下修改后的AndroidManifestres目录结构

2.2引入unity的classes.jar包

找到unity的classes.jar包。

windows下和mac下包的路径分别为

C:

\ProgramFiles\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\classes.jar

/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes\classes.jar

将其拷贝到UnityAndroid项目app目录下的libs目录下,然后进行导入,导入之后可以发现在build.gradle中就有他的引入了。

导入classes.jarclasses.jar导入成功

2.3为unity写android方法

首先需要让MainActivity继承UnityPlayerActivity,因为unity导出的app的视图展示需要在UnityPlayerActivity下。

假如MainActivity继承的是Activity,那么显示的就是Android自己的界面。

在这里我们写两个方法,一个是弹出Toast通知,一个是获取当前时间,具体代码如下。

packagecn.unity.android;

importandroid.os.Bundle;

importandroid.os.Handler;

importandroid.os.Looper;

importandroid.widget.Toast;

importcom.unity3d.player.UnityPlayerActivity;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjava.util.Locale;

publicclassMainActivityextendsUnityPlayerActivity{

privateToastmToast;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

}

publicvoidshowToast(finalStringtext){

newHandler(Looper.getMainLooper()).post(newRunnable(){

publicvoidrun(){

if(mToast==null){

mToast=Toast.makeText(MainActivity.this,text,Toast.LENGTH_SHORT);

}else{

mToast.setText(text);

}

mToast.show();

}

});

}

publicStringgetNowTime(){

longtime=System.currentTimeMillis();

returnnewSimpleDateFormat("yyyy年MM月dd日HH:

mm:

ss",Locale.CHINESE).format(newDate(time));

}

}

接下来需要导出aar包和jar包,为接下来unity调用提供方法。

点击build-->buildapk,然后在app-->build-->outputs-->aar目录下的到app-debug.aar文件app-debug.aar

将app-debug.aar文件解压,得到根目录下的classes.jar文件,请注意这个classes.jar文件并不是最开始从unity中导入到android的classes.jar文件,而且你写的android代码的class文件的压缩包(可以解压看看里面实际的内容)。

之后unity所需要使用的是res文件夹下的文件,classes.jar(android的)和AndroidManifest文件。

解压后的文件

(ps:

理论上来说现在版本的unity是直接可以使用android的aar包的,但是博主在实际使用过程中一直会有问题,所以这边所使用的还是jar包和res文件的形式,如果有小伙伴使用aar成功的话请告知博主)

3Unity上的操作

3.1创建Unity项目

打开unity,创建项目名称为UnityDemo,layout的格式改为2by3,project下修改为Onecolumnlayout(纯粹是个人喜欢这种布局的方法,当然你也可以用其他的)。

Onecolumnlayout2by3

往unity添加一个canvas(画布),设置rendermode为screenspacecamera(跟随相机的模式),然后设置uiscalemode为scalewithscreencamera并设置x,y为600和400。

添加canvas

往canvas中添加一个text和一个button,并调整他们的大小和位置,用于之后的事件操作和显示。

text最终的ui显示

然后将我们之前导出的jar和res文件拷贝到Plugins/Android文件夹下。

导入文件

3.2编写unity脚本

新建一个AndroidControl的C#脚本,并将其挂载到Canvas对象上。

(直接通过鼠标左键拖动到Canvas上)。

打开脚本,在OnStart()方法中获取android的MainActivity对象。

privateAndroidJavaObjectjo;

voidStart()

{

//获取Android的Java接口

AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");

jo=jc.GetStatic("currentActivity");

}

首先获取unityPlayer实例,每个unityapp在启动的时候都会有一个unityPlayer实例。

通过获取该实例里面currentActivity对象,其实就是我们的MainActivity实例。

我们可以在androidstudio中查看源码的方式知道为什么是获取这个currentActivity。

UnityPlayer

创建方法ShowAndroidTime来获取系统时间并进行显示。

publicvoidShowAndroidTime()

{

stringtime=jo.Callstring>("getNowTime");

jo.Call("showToast",newobject[]{time});

}

首先调用MainActivity中的getNowTime方法得到时间,然后在调用showToast方法让时间Toast出来。

接下来是要对button设置点击事件去调用这个ShowAndroidTime方法。

选中button,然后砸onclick点击+。

由于我们的脚本是挂在到Canvas上的,所以需要选择canvas对面里面的AndroidControl脚本的ShowAndroidTime方法。

添加点击事件

3.3导出Androidapp

将scene保存,然后点击file-->buildsettings,选择platform为android,然后点击switchplatform,同时将要导出的sceneadd进来。

settings

点击playersettings进行一些android导出的设置。

在这里我们设置apk的名称为UnityDemo,显示为横屏,设置包名为cn.unity.demo,要注意的是把installlocation设置为Automatic,否则apk会安装失败,同时需要指定apk的签名。

名称横屏包名签名

最后点击build导出apk,如果已经连接上android设备的话,可以直接buildandrun进行导出和启动。

导出apk

看下我们最终实现的效果效果

4Android上调用Unity的方法

以上我们实现了unity上调用android的方法,那么android上如何调用unity的方法呢,我们先回到unity的AndroidControl脚本。

添加方法OnTimeResult,注意在这里需要导入UnityEngine.UI包usingUnityEngine.UI;

publicvoidOnTimeResult(stringresult)

{

Texttext=GameObject.Find("TimeShow").GetComponent();

text.text=result;

}

上面代码的意思是获取名称为TimeShow的对象,然后将该对象上的Text脚本的文本改为得到的result。

所以我们需要将之前的Text对象名称改为TimeShow修改名称

回到android的MainActivity,修改方法showToast,让Toast时间的时候同时调用OnTimeResult方法修改text的文本。

publicvoidshowToast(finalStringtext){

newHandler(Looper.getMainLooper()).post(newRunnable(){

publicvoidrun(){

if(mToast==null){

mToast=Toast.makeText(MainActivity.this,text,Toast.LENGTH_SHORT);

}else{

mToast.setText(text);

}

mToast.show();

UnityPlayer.UnitySendMessage("Canvas","OnTimeResult",text);

}

});

}

UnityPlayer.UnitySendMessage("Canvas","OnTimeResult",text);方法的意思是调用名称为Canvas对象上的OnTimeResult方法,传入的参数为text。

这样我们的操作就完成了,重复上面的操作,我们来看下效果。

效果

5使用adblogcat查看日志

上述的过程已经完成了unity和android之间的方法的相互调用,但是问题来了。

这样没有出错还好,一旦出错,如何查看日志呢。

这个时候我们可以使用android的adb工具了。

(使用之前我们需要配置环境变量,至于如何配置adb的环境,这里就不多阐述了)。

在unity的脚本代码中,增加日志的输出。

并导出apk

publicvoidOnTimeResult(stringresult)

{

Texttext=GameObject.Find("TimeShow").GetComponent();

text.text=result;

Debug.Log("UnityTime-->"+result);

}

打开控制台,输入adblogcat-sUnity,然后打开apk,点击button,这个时候就可以看到刚刚的日志输出了。

(ps:

更多的adblogcat的语法可以自己XXgoogle查看)logcatlogcat输出

6后续:

至此,一个比较完整的unity和android交互的步骤和如何查看日志就已经完成了。

如果大家在学习使用的过程有什么问题或者有什么更好的方法方式欢迎一起交流。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1