Android Unity 交互
系列篇一
所有篇幅
Unity Android 交互
Unity Android 交互二
Unity Android 交互三 多 aar 接入 Unity 自动合并多个 AndroidManifest.xml
Unity Android SDK 接入 讯飞 SDK 实战
之前使用 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 测试成功