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项目)如下

unity ffmpeg交互_android studio

File –> New -> New Module

unity ffmpeg交互_android_02

此处选择了 Phone

unity ffmpeg交互_unity_03

修改默认包名和 Unity 项目中 Bundle Identifier 一致,选择 API 版本

unity ffmpeg交互_unity ffmpeg交互_04

创建一个 Empty Activity

unity ffmpeg交互_android_05

确认一个主Activity名,我在此就用默认的 MainActivity 了,确认布局文件 Layout 名,在此也使用默认的 activity_main.xml了

unity ffmpeg交互_android studio_06

创建完成后需要等待Android Studio 自动编译,编译完成没有报错

unity ffmpeg交互_android_07

Src -> androidTest、Src -> test 为自动生成的测试文件,用不到直接删除

Src-> main->res 会有一些配置文件,布局文件等,也用不到

unity ffmpeg交互_android studio_08

删除后

unity ffmpeg交互_android_09

colors.xml、 strings.xml、strles.xml 都清空了

unity ffmpeg交互_android studio_10

unity ffmpeg交互_android_11

unity ffmpeg交互_aar_12

打开布局文件 activity_main.xml

unity ffmpeg交互_unity_13

TextView 就不需要了直接删除

打开 AndroidManifest.xml

unity ffmpeg交互_android studio_14


上面变红的都是刚才删掉的,将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

unity ffmpeg交互_android_15

打开 build.gradle

unity ffmpeg交互_unity ffmpeg交互_16

手动修改 apply plugin: 'com.android.application'apply plugin: 'com.android.library'

手动删除applicationId "com.librarytwo.deom"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

引用库通过下面方法删除
选择 mylibraytwo 右键 Open Module Setting 删除无用引用

unity ffmpeg交互_android_17

弹出窗口, 左侧选择 mylibrarytwo 右上角选择 Dependencies

unity ffmpeg交互_unity ffmpeg交互_18

再打开 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 报错,

unity ffmpeg交互_unity_19

查看发现引用库 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

unity ffmpeg交互_unity ffmpeg交互_20

执行成功再 mylibrarytow -> build ->outputs -> aar 文件下生成 arr

unity ffmpeg交互_android_21

上面生成一个 debug.aar 想要生成 release 修改配置

Android Studio 左下角 BuildVariants,

unity ffmpeg交互_android_22

修改为 release 后 执行 Build -> Clear Project 等执行成功然后 Build -> Rebuild Project

生成一个 release.aar

unity ffmpeg交互_android studio_23

到此测试生成 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 文件夹

unity ffmpeg交互_android studio_24

设置对 classes.jar 的引用 选择 Module 右键 Open Module Setting

unity ffmpeg交互_android studio_25

和刚才删除引用库基本一样,选择右上角 + 号,选择 jar dependency

unity ffmpeg交互_aar_26

unity ffmpeg交互_unity_27

打开 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 ffmpeg交互_unity ffmpeg交互_28

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'.

unity ffmpeg交互_android studio_29


然后解压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 在模拟器上运行测试

unity ffmpeg交互_unity ffmpeg交互_30

点击 Add 按钮 文本变为 300 测试成功

unity ffmpeg交互_aar_31

点击 ShowDialog 按钮 弹出对话框,文本变为 我是Android 测试成功

unity ffmpeg交互_unity_32