Unity和Android交互

前言:Android 軟件的開發(fā)中,會經(jīng)常遇到 Unity 調(diào)用 Android 中的接口方法,不單是內(nèi)購和廣告的接入,普通的使用 Unity 去調(diào)用 Android 的原生消息框都會需要使用到交互相關(guān)的知識,接下來我們開始吧.

前期需要準(zhǔn)備:

確認(rèn)安裝 Android Studio 開發(fā)軟件.

整體步驟我分為:

  • 基于 AS(Android Studio) 編寫接口方法類并打出 jar

  • 配置關(guān)聯(lián) Unity 編寫調(diào)用 Android 原生方法接口方法

  • 配置打包環(huán)境安裝到 Android 設(shè)備

我的開發(fā)環(huán)境:

Unity 版本為 2017.4.6f1

Android Studio 版本為 3.2.0

1.基于 AS 編寫接口方法類并打出 jar.

打開 Android Studio,選擇 Start a new Android Studio project 新建一個 Android 工程.

創(chuàng)建工程

下面是設(shè)置工程名字簽名存放位置等等,這里我簡單填寫就好,目的是編寫接口方法打出 jar,設(shè)置完畢后點(diǎn)擊 Next.

設(shè)置名字與簽名

這里我選擇的是 Android 手機(jī),最小兼容的版本為 API 16 ,也就是 Android 4.1,接著點(diǎn) Next.

選擇最小兼容的 API 版本

接著會提示讓我們創(chuàng)建一個 Activity 類,這里我們選擇 Add No Activity 不添加 Activity,再點(diǎn)擊 Finish 完成創(chuàng)建.

Add an Activity to Mobile 界面

工程創(chuàng)建完畢后,首先切換成 Project 視圖,也就是綠框中的選項(xiàng).
右鍵點(diǎn)擊我們工程的主目錄選擇 New -> Module 創(chuàng)建一個新 Module.

創(chuàng)建 Module

選擇 Android Library 后點(diǎn)擊 Next.

New Module 界面

設(shè)置好名字后點(diǎn)擊 Finish .

Android Library 界面

創(chuàng)建好 Module 后,別忘了添加用于編譯的 Unity 庫,將你 Unity 安裝目錄下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar 文件復(fù)制到我們工程中剛剛創(chuàng)建的 Modulelibs 目錄下.

復(fù)制到 Unity 工程中

回到 AS 界面,會發(fā)現(xiàn)我們創(chuàng)建的 Module 目錄下的 libs 下出現(xiàn)了我們復(fù)制添加的 classes.jar 庫.

Android Studio Project 視圖

光添加進(jìn)來可沒用,我們還需要給它添加依賴.
右鍵點(diǎn)擊我們創(chuàng)建的 Module 選擇 Open Module Settings 打開 Module 設(shè)置面板.

打開 Module 設(shè)置界面

點(diǎn)擊我們創(chuàng)建的 Module 選擇 Dependencies -> Jar dependency.

設(shè)置依賴庫

選擇我們從 Unity 復(fù)制添加的 classese.jar 后點(diǎn)擊 OK.

選擇 classes.jar

設(shè)置好依賴庫后,我們可以開始編寫接口方法類了,右鍵點(diǎn)擊我們創(chuàng)建的 Module 目錄下src/main/java/com.xxx.xxx 選擇 New -> Java Class.

添加 Java 類

設(shè)置好我們的 Activity 類名(就是我們的接口方法類)

添加 Java 類設(shè)置

Superclass 是設(shè)置要繼承的父類,這里我們事先設(shè)置為繼承 UnityPlayerActivity.

在剛剛創(chuàng)建的 Java 文件中添加以下代碼.

import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class UnityAndroidActivity extends UnityPlayerActivity {
    public void SetInfo() {
        UnityPlayer.UnitySendMessage("Main Camera", "SetInfo", "Hello Unity!");
    }

    public void SendToast(String info) {
        Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
    }
}

首先我定義了一個私有 String 類型的變量.接著還有兩個方法.

方法一:調(diào)用 Unity 中名為 Main Camera 的游戲?qū)ο笊砩衔覀兙帉懙哪_本中的 SetInfo 方法,并發(fā)送一串字符為 SetInfo 的第一個參數(shù).

方法二:將 info 的內(nèi)容用 Toast 發(fā)送一條消息.

現(xiàn)在我們的方法接口類已經(jīng)準(zhǔn)備好了,可以開始將我們寫好的類打包成 jar 庫了.

首先點(diǎn)擊上方的 Build 選擇 Make Module 'xxx'.

Make Module

打開我們 Module 目錄下的 build.gradle 文件.

build.gradle

在 build.gradle 中的最下方添加以下代碼:

android.libraryVariants.all { variant ->
    def task = project.tasks.create "jar${variant.buildType.name.capitalize()}",Jar
    task.dependsOn variant.javaCompile
    task.from variant.javaCompile.destinationDir
    artifacts.add('archives',task)
}

task jarUnityLib(type: Jar, dependsOn: ['build']) {
    archiveName = 'UnityAndroid.jar' //設(shè)置打出 jar 包的名字.
    from('build/intermediates/javac/release/compileReleaseJavaWithJavac/classes')
    destinationDir = file('build/libs')
    exclude('com/Test/unityandroidlibrary/BuildConfig.class') //這里是自動設(shè)置好刪除BuildConfig.class
    exclude('com/Test/unityandroidlibrary/BuildConfig\$*.class')
    exclude('**/R.class') //這里是自動設(shè)置好刪除 R.class 文件
    exclude('**/R\$*.class')
    include('com/Test/unityandroidlibrary/UnityAndroidActivity*.class') //這里是選擇要導(dǎo)出的方法接口類

}

注意: from 要根據(jù)自己的 Gradle 版本進(jìn)行設(shè)置,由于我的 Gradle 版本是 4.6 ,是剛剛更新 AS 3.2.0 自動更新的.

如果是 4.6 之前的版本,大概要填 build/intermediates/javac/release ,具體所填,請自行查閱填之.

點(diǎn)擊右上方的 Gradle 選擇我們的 ModuleGradle 選擇 other .

Gradle 任務(wù)界面

other 中找到我們編寫的任務(wù) jarUnityLib 并雙擊它.

jarUnityLib 任務(wù)

打包完畢后會出現(xiàn)以下 Log 消息.

打包后的 Log 消息

在我們的 Module 目錄下會出現(xiàn)剛剛打出的 jar 包.

打出的 Jar 包

2.配置關(guān)聯(lián)Unity,編寫調(diào)用Android原生方法接口類

打開 Unity ,設(shè)置好工程名字后點(diǎn)擊 Create project 創(chuàng)建工程.

創(chuàng)建 Unity 工程界面

創(chuàng)建好工程后,右鍵點(diǎn)擊 Assets 選擇 Create -> Folder 創(chuàng)建文件夾.

創(chuàng)建 Android 交互所需文件夾

按照下列格式創(chuàng)建文件夾,分別為 Plugins Android libs 三個文件夾.

要創(chuàng)建的文件夾格式

右鍵點(diǎn)擊 Android 文件夾選擇 Show in Explorer 打開目錄.

打開 Android 所在目錄

Android 目錄下創(chuàng)建一個 AndroidManifest.xml ,可以創(chuàng)建 Txt 文本后連同拓展名一起修改為 xml 文件.

創(chuàng)建 AndroidManifest.xml 文件

添加以下代碼:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:label="@string/app_name">
        <activity android:name="com.Test.unityandroidlibrary.UnityAndroidActivity"
            android:label="@string/app_name"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screen
Layout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <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>

需要注意: 第三行所要設(shè)置的主 Activity 需要填寫我們編寫的方法接口類,由于是繼承 UnityPlayerActivity 所以可以將主 Activity 設(shè)置為我們所編寫的方法接口類.

右鍵點(diǎn)擊我們打好的 UnityAndroid.jar 后選擇 Show in Explorer .

打開打好的 jar 包目錄

將打好的 jar 包復(fù)制一份到 Unity 中先前創(chuàng)建的 Plugins/Android/libs 目錄下.

復(fù)制到 Unity 工程的 libs 目錄

回到Unity 界面,創(chuàng)建一個 Sctipts 文件夾用于放置 Unity 腳本,右鍵點(diǎn)擊剛剛創(chuàng)建的文件夾選擇
Create -> C# Script 創(chuàng)建腳本,腳本名字可以自定義設(shè)置.

創(chuàng)建 C# 腳本

創(chuàng)建好腳本后打開它.

添加以下代碼:

using UnityEngine;

public class UnityAndroidTest : MonoBehaviour
{
        private AndroidJavaObject m_Jo;
        private AndroidJavaClass m_Jc;
        private string m_Info = null;

        private void Start()
        {
             m_Jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
             m_Jo = m_Jc.GetStatic<AndroidJavaObject>("currentActivity");
             m_Jo.Call("SetInfo");
        }

        public void SetInfo(string info)
        {
             m_Info = info;
        }

        public void SendToast()
        {
             m_Jo.Call("SendToast", m_Info);
        }
}

以上代碼解析:

  • 首先定義了 AndroidJavaObjectAndroidJavaClass 以及一個 String 類型的變量 m_Info .

  • Start 方法中初始化了 m_Jcm_Jo .還調(diào)用Android 中我們編寫 SetInfo 接口方法.

  • SetInfo 方法是用于給 Android 調(diào)用的公開方法,賦值當(dāng)前類中的 m_Info .

  • SendToast 是輔助調(diào)用 Android 中發(fā)送當(dāng)前類中 m_Info 內(nèi)容到屏幕上.

編寫并保存腳本后,回到 Unity 界面.
將我們編寫好的腳本拖至 Main CameraInspector 中.

拖拽腳本至 Main Camera 的 Inspector

右鍵點(diǎn)擊 Hierarchy 面板,選擇 UI -> Button 創(chuàng)建一個按鈕.

創(chuàng)建 Button 按鈕

點(diǎn)擊我們剛剛創(chuàng)建的 Button ,將 MainCamera 拖至 ButtonInspector 面板的 OnClick 下.
點(diǎn)擊 No Function 選擇 UnityAndroidTest(也就是我們剛剛創(chuàng)建的腳本)-> SendToast()

添加 OnClick 事件

新建一個 Scenes 文件夾用于存放場景文件,使用快捷鍵 Ctrl + S 進(jìn)行保存.

保存場景

設(shè)置好場景名點(diǎn)擊保存即可保存場景.


3.配置打包環(huán)境安裝到Android設(shè)備

點(diǎn)擊 File -> Build Settings 打開右邊的界面.
確認(rèn)當(dāng)前是 Android 開發(fā)環(huán)境,點(diǎn)擊 Android 再點(diǎn)擊 Switch Platform 切換開發(fā)環(huán)境.

切換開發(fā)環(huán)境到 Android

點(diǎn)擊 Add Open Scenes 添加需要加載的場景.
Android 選項(xiàng)右方若有 Unity 的圖標(biāo)就代表現(xiàn)在是 Android 開發(fā)環(huán)境.
接著點(diǎn)擊 Player Settings 進(jìn)行打包前的基本設(shè)置.

配置打包設(shè)置

配置解析:
設(shè)置應(yīng)用的名字,設(shè)置好簽名以及最低兼容的版本 Android 4.1 和默認(rèn)最高的目標(biāo)版本.

Player Settings 界面

準(zhǔn)備完畢后,就可以用 USB 線連接你的 Android 手機(jī).
確認(rèn)連接完畢后點(diǎn)擊 Build And Run 進(jìn)行打包.

開始打包

打包成功后打開,點(diǎn)擊 Button 按鈕后會出現(xiàn)一條 Android 發(fā)送到 Unity 的一條 HelloUnity! 的消息.
這條消息是通過 Android 發(fā)送到 Unity , Unity 再通過調(diào)用 Android 發(fā)送消息的方法將收到的內(nèi)容發(fā)送到屏幕上.

Demo 測試界面

到此 UnityAndroid 的交互就完成了.比起 iOS 的交互, Android 的交互繁瑣了許多.
第一次寫技術(shù)文檔,寫的不好的地方請多多指教.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洗鸵,隨后出現(xiàn)的幾起案子膘滨,更是在濱河造成了極大的恐慌吏祸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泛鸟,居然都是意外死亡踊东,警方通過查閱死者的電腦和手機(jī)闸翅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門坚冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來记某,“玉大人液南,你說我怎么就攤上這事⊥嘲猓” “怎么了闪幽?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵盯腌,是天一觀的道長腕够。 經(jīng)常有香客問我,道長玫荣,這世上最難降的妖魔是什么捅厂? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任焙贷,我火速辦了婚禮辙芍,結(jié)果婚禮上故硅,老公的妹妹穿的比我還像新娘纵搁。我一直安慰自己腾誉,他們只是感情好妄辩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布眼耀。 她就那樣靜靜地躺著哮伟,像睡著了一般妄帘。 火紅的嫁衣襯著肌膚如雪抡驼。 梳的紋絲不亂的頭發(fā)上致盟,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音伟端,去河邊找鬼责蝠。 笑死萎庭,一個胖子當(dāng)著我的面吹牛擎椰,可吹牛的內(nèi)容都是我干的达舒。 我是一名探鬼主播巩搏,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贯底,長吁一口氣:“原來是場噩夢啊……” “哼禽捆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琐凭,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤统屈,失蹤者是張志新(化名)和其女友劉穎愁憔,沒想到半個月后吨掌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思犁,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡激蹲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年学辱,在試婚紗的時候發(fā)現(xiàn)自己被綠了策泣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萨咕。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡危队,死狀恐怖茫陆,靈堂內(nèi)的尸體忽然破棺而出簿盅,到底是詐尸還是另有隱情,我是刑警寧澤棚瘟,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響蔓肯,放射性物質(zhì)發(fā)生泄漏蔗包。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秦躯。 院中可真熱鬧踱承,春花似錦倡缠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至载荔,卻和暖如春盾饮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懒熙。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煌珊,地道東北人号俐。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像定庵,于是被迫代替她去往敵國和親吏饿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容