Android Unity 交互

来源:互联网 发布:淘宝网千人千面 编辑:程序博客网 时间:2024/05/16 09:54

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 自带AndroidUnity交互的类库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.aarAndroidManifest.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 测试成功
这里写图片描述