Android Unity 交互
之前使用 Eclipse 导出 jar 包导入 Unity 交互,下面使用 Android Studio 生成 arr 导入Unity 中交互
1.打开 Android Studio 随意创建一个 Project(此处无用,只是用来打开Android Studio 并且有一个 Project)
2.创建一个 Module
第一步创建的是一个 Project,这一步创建的是 Module。Android Studio 中 Project 和 Module 的区别可以在网上查,在此简单说下,一个工作目录 Project 对应了一个文件夹,在这个文件夹下可以放多个 Android 项目(Module就相当于一个Android项目)如下
File –> New -> New Module
此处选择了 Phone
修改默认包名和 Unity 项目中 Bundle Identifier 一致,选择 API 版本
创建一个 Empty Activity
确认一个主Activity名,我在此就用默认的 MainActivity 了,确认布局文件 Layout 名,在此也使用默认的 activity_main.xml了
创建完成后需要等待Android Studio 自动编译,编译完成没有报错
Src -> androidTest、Src -> test 为自动生成的测试文件,用不到直接删除
Src-> main->res 会有一些配置文件,布局文件等,也用不到
删除后
colors.xml、 strings.xml、strles.xml 都清空了
打开布局文件 activity_main.xml
TextView 就不需要了直接删除
打开 AndroidManifest.xml
上面变红的都是刚才删掉的,将manifest.xml中红色的删除
最终如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.librarytwo.deom">
<application
android:allowBackup="true"
android:supportsRtl="true"
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 一定要加上这句 -->
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
下面测试生成 aar
修改 build.gradle
打开 build.gradle
手动修改 apply plugin: 'com.android.application'
为 apply plugin: 'com.android.library'
手动删除applicationId "com.librarytwo.deom"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
引用库通过下面方法删除
选择 mylibraytwo 右键 Open Module Setting 删除无用引用
弹出窗口, 左侧选择 mylibrarytwo 右上角选择 Dependencies
再打开 build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
}
发现 dependencies 里边的引用库自动删除了
自动编译结束 MainActivity.java 报错,
查看发现引用库 import android.support.v7.app.AppCompatActivity;
报错 MainActivity
继承于AppCompatActivity
直接将 import android.support.v7.app.AppCompatActivity;
删除将 ,修改 MainActivity
继承于 Activity
public class MainActivity extends Activity
结果如下
package com.librarytwo.deom;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
选择 mylibrarytow 菜单栏 Build -> Build APK
执行成功再 mylibrarytow -> build ->outputs -> aar 文件下生成 arr
上面生成一个 debug.aar 想要生成 release 修改配置
Android Studio 左下角 BuildVariants,
修改为 release 后 执行 Build -> Clear Project 等执行成功然后 Build -> Rebuild Project
生成一个 release.aar
到此测试生成 aar 成功
下面开始 Unity
交互
添加类库:Unity
自带Android
与Unity
交互的类库classes.jar
使用Mono
打包 APK
就要使用 Mono
下类库 Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\ classes.jar
。
使用IL2CPP
打包APK
则使用 il2cpp
下类库
Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes\ classes.jar
复制classes.jar 到 libs 文件夹
设置对 classes.jar 的引用 选择 Module 右键 Open Module Setting
和刚才删除引用库基本一样,选择右上角 + 号,选择 jar dependency
打开 build.gradle dependencies
中自动添加了一行,说明对 classes.jar 的引用
dependencies {
implementation files('libs/classes.jar')
}
修改ManiActivity.java
package com.librarytwo.deom;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer; // 添加引用
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity { // 继承于 UnityPlayerActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// 显示一个对话框
// 返回 String
// _title 对话框标题
// _content 对话框显示内容
public String ShowDialog(final String _title, final String _content)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(_title).setMessage(_content).setPositiveButton("OK", null);
builder.show();
}
});
CallUnity("TestAndroid", "AndroidCall", "我是Android");
return _title + _content;
}
// 返回两个数相加的和
public int AddNumber(final int number1, final int number2)
{
return number1 + number2;
}
// 调用 Unity
// gameObjectName 为接受消息的Unity 中 GameObject 的名字
// functionName 为接受消息的GameObject 挂载 C# 脚本中的函数名
// _content 为发送给Unity 的内容
public void CallUnity(String gameObjectName, String functionName, String _content)
{
UnityPlayer.UnitySendMessage(gameObjectName, functionName, _content);
}
}
生成 aar
找到 mylibrarytow-release.aar用解压工具打开,删除掉 libs 下的 classes.jar
Unity 打包APK 时会将 classes.jar 重新加入到 APK 中,不删除 classes.jar打包时会冲突报错
IOException: Failed to Move File / Directory from 'Temp/StagingArea\android-libraries\mylibrarytow-release\classes.jar' to 'Temp/StagingArea\android-libraries\mylibrarytow-release\libs\classes.jar'.
然后解压arr 获取 AndroidManifest.xml
将 mylibrarytow-release.aar
和 AndroidManifest.xml
放到 Unity 项目 Plugins -> Android
目录下
Unity 创建和 arr 交互的 C# 脚本,代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestLibraryTow : MonoBehaviour {
public Text text;
public Button addButton;
public Button showDialogButton;
// Use this for initialization
void Start () {
addButton.onClick.AddListener(AddOnClick);
showDialogButton.onClick.AddListener(ShowDialogOnClick);
}
private void AddOnClick()
{
#if UNITY_ANDROID
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // Android 的 Java 接口
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
int result = jo.Call<int>("AddNumber", 100, 200);
SetText(result.ToString());
}
}
#endif
}
private void ShowDialogOnClick()
{
#if UNITY_ANDROID
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // Android 的 Java 接口
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
string str = jo.Call<string>("ShowDialog", "标题", "Hello World");
SetText(str);
}
}
#endif
}
public void AndroidCall(string value)
{
SetText(value);
}
private void SetText(string content)
{
text.text = content;
}
}
打包 APK 在模拟器上运行测试
点击 Add 按钮 文本变为 300 测试成功
点击 ShowDialog 按钮 弹出对话框,文本变为 我是Android 测试成功