Unity和Android混合开发
通⽤的流程
应⽤场景
Unity游戏中⼀些功能需要安卓系统的⽀持,如搜索wifi等。⽽且想接⼊SDK时,很多都是针对安卓的SDK,很少有针对Unity的,所以必须要学习Unity和Android的互调。
⽹上能搜到很多相关的内容,但⼤多由于年代久远,Unity和Android Studio版本更新等问题,导致各种⽆尽的报错让⼈崩溃,所以还是要记录⼀下。
环境
Unity5.6或2017.3.0f3 + JDK1.8.0_131 + Android Studio3.0.1 + gradle-4.1-all + Visual Studio2017
Unity2017⾼版本取消了Internal的打包⽅式。
VS还好,另外⼏个要⼩⼼各种版本感⼈莫名其妙的Bug兼容问题
JDK可以是7或8,⼀定不能是9!
Android Studio上次⼿贱点了升级,升到v3.1后打包出来⽬录结构有变动,不到jar包的位置。且打出的aar包在Unity中调⽤显⽰不到⽬标⽅法。
Unity与Android的交互有两种思路
Unity打包APK时,调⽤安卓SDK,把所有游戏内容整合打包出的APK中只有⼀个MainActivity。
⼀、导出Jar包 + 扩展MainActivity + Java主导
Unity调安卓
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="schemas.android/apk/res/android"
package="guxin.demo.unityandroidlibrary">
<application
android:allowBackup="true"
android:label="UnityAndroidTest"
android:supportsRtl="true">
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
</intent-filter>
</activity>
</application>
</manifest>
6、回到模块的MainActivity,修改该类继承⾃UnityPlayerActivity。在该类中添加⾃定义的⽅法,⽤于给Unity调⽤。如:
public int add(int a, int b){
return a + b;
}
7、在AS中Project⽬录选中unityandroidlibrary,在Build菜单下选Make Module ‘unityandroidlibrary’单独编译这个模块。
8、在unityandroidlibrary/build/intermediates/bundles/debug⽬录右键Show in Explorer。删除debug/libs/classes.jar(等同于刚从Unity那边拷过来的内容),把debug/classes.jar拖到debug/libs中(这个是包含了刚新增的扩展⽅法的)。把libs和res这两个⽂件夹备份(如复制到桌⾯)。 
9、在unityandroidlibrary/build/intermediates/manifests/full/l右键Show in Explorer,也把这个清单⽂件复制出来(如复制到桌⾯)。打开在桌⾯的副本,修改package包名为在Unity中想要的包名,如包名最后⼀段改为
unityandroidtest(注意包名要全部⼩写)。
10、打开Unity,创建⼀个⼯程UnityAndroidTest,Build Settings切换为安卓平台,Player Settings中
修改包名,包名同上⼀步的⼀致(先调平台再调包名)。在Assets下新建⽂件夹Plugins/Android(名字固定的,⼩⼼别漏了s),将上两步得到的三个⽂件拖到该⽂件夹中。
11、新建⼀个C#脚本,VS打开编辑如下。把该脚本挂到任⼀场景中的游戏对象上(如Main Camera)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
public Text text; // ⽤于展⽰调⽤结果
void Start ()
{
// 获得位于com.unity3d.player包下的UnityPlayer类,固定写法。
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");  // 参数是包名+类名
// 获得jc所代表的类⾥的currentActivity对象,固定写法。这是Unity提供的classes.jar中的功能,可通过currentActivity获取到安卓端代表MainActivty的对象。
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 调⽤MainActivty中的⾃定义⽅法。
< = jo.Call<int>("add", 1, 2).ToString();
}
}
12、最后⼀步,连上真机并打开USB调试,Build & Run,路径选择桌⾯。此时会把APK输出到桌⾯并安装到真机上运⾏,即可看到调⽤结果。下图是我⽤AS的安卓模拟器(AVD)运⾏的效果。注意了,要打包发布出来⽤,直接在Unity编辑器点运⾏会报错,但打包出来安卓机运⾏没有问题的。
安卓调Unity
继续上⾯的⼯程。
1、在Unity刚才的脚本中,添加⼀个⽅法,给安卓调⽤。
单人开发选ue4还是unity// 交由安卓调Unity。
public void ChangeColor()
{
}
2、在安卓端unityandroidlibrary模块的MainActivity类中,修改add()⽅法。该⽅法由Unity调⽤,⽅法中再由安卓调Unity中的⽅法,从⽽实现两者的互调。
// Unity调安卓
public int add(int a, int b){
// 安卓调Unity
UnityPlayer.UnitySendMessage("Main Camera", "ChangeColor", ""); // 参数:GameObject名 + ⽅法名 + 参数
return a + b;
}
3、重新把该模块编译。build菜单下选Make Module 'unityandroidlibrary'。同样是在
unityandroidlibrary/build/intermediates/bundles/debug⽬录右键Show in Explorer,拖拽debug/classes.jar到libs中替换掉
libs/classes.jar。把libs和res⽂件夹拷贝到桌⾯。然后放到Unity中替换掉之前Assets/Plugins/Android⽬录下的libs和res⽂件夹。(l可以不⽤替换)
4、Build & Run 。效果如下。可以看到Text⽂本颜⾊变红⾊了。
关于APP在⼿机桌⾯上显⽰的软件名称
当Assets/Plugins/l中的android:label节点指定的软件名,与Unity的Player Settings中Product Name 指定的软件名不⼀致时,最终打出的APK包以前者为准!如下图。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。