前言: 在 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 工程.
下面是設(shè)置工程名字簽名存放位置等等,這里我簡單填寫就好,目的是編寫接口方法打出 jar,設(shè)置完畢后點(diǎn)擊 Next.
這里我選擇的是 Android 手機(jī),最小兼容的版本為 API 16 ,也就是 Android 4.1,接著點(diǎn) Next.
接著會提示讓我們創(chuàng)建一個 Activity 類,這里我們選擇 Add No Activity 不添加 Activity,再點(diǎn)擊 Finish 完成創(chuàng)建.
工程創(chuàng)建完畢后,首先切換成 Project 視圖,也就是綠框中的選項(xiàng).
右鍵點(diǎn)擊我們工程的主目錄選擇 New -> Module 創(chuàng)建一個新 Module.
選擇 Android Library 后點(diǎn)擊 Next.
設(shè)置好名字后點(diǎn)擊 Finish .
創(chuàng)建好 Module 后,別忘了添加用于編譯的 Unity 庫,將你 Unity 安裝目錄下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
文件復(fù)制到我們工程中剛剛創(chuàng)建的 Module 的 libs 目錄下.
回到 AS 界面,會發(fā)現(xiàn)我們創(chuàng)建的 Module 目錄下的 libs 下出現(xiàn)了我們復(fù)制添加的 classes.jar 庫.
光添加進(jìn)來可沒用,我們還需要給它添加依賴.
右鍵點(diǎn)擊我們創(chuàng)建的 Module 選擇 Open Module Settings 打開 Module 設(shè)置面板.
點(diǎn)擊我們創(chuàng)建的 Module 選擇 Dependencies -> Jar dependency.
選擇我們從 Unity 復(fù)制添加的 classese.jar 后點(diǎn)擊 OK.
設(shè)置好依賴庫后,我們可以開始編寫接口方法類了,右鍵點(diǎn)擊我們創(chuàng)建的 Module 目錄下src/main/java/com.xxx.xxx
選擇 New -> Java Class.
設(shè)置好我們的 Activity 類名(就是我們的接口方法類)
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'.
打開我們 Module 目錄下的 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 選擇我們的 Module 的 Gradle 選擇 other .
在 other 中找到我們編寫的任務(wù) jarUnityLib 并雙擊它.
打包完畢后會出現(xiàn)以下 Log 消息.
在我們的 Module 目錄下會出現(xiàn)剛剛打出的 jar 包.
2.配置關(guān)聯(lián)Unity,編寫調(diào)用Android原生方法接口類
打開 Unity ,設(shè)置好工程名字后點(diǎn)擊 Create project 創(chuàng)建工程.
創(chuàng)建好工程后,右鍵點(diǎn)擊 Assets 選擇 Create -> Folder 創(chuàng)建文件夾.
按照下列格式創(chuàng)建文件夾,分別為 Plugins Android libs 三個文件夾.
右鍵點(diǎn)擊 Android 文件夾選擇 Show in Explorer 打開目錄.
在 Android 目錄下創(chuàng)建一個 AndroidManifest.xml ,可以創(chuàng)建 Txt 文本后連同拓展名一起修改為 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 包復(fù)制一份到 Unity 中先前創(chuàng)建的 Plugins/Android/libs
目錄下.
回到Unity 界面,創(chuàng)建一個 Sctipts 文件夾用于放置 Unity 腳本,右鍵點(diǎn)擊剛剛創(chuàng)建的文件夾選擇
Create -> C# Script 創(chuàng)建腳本,腳本名字可以自定義設(shè)置.
創(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);
}
}
以上代碼解析:
首先定義了 AndroidJavaObject 和 AndroidJavaClass 以及一個 String 類型的變量 m_Info .
Start 方法中初始化了 m_Jc 和 m_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 Camera 的 Inspector 中.
右鍵點(diǎn)擊 Hierarchy 面板,選擇 UI -> Button 創(chuàng)建一個按鈕.
點(diǎn)擊我們剛剛創(chuàng)建的 Button ,將 MainCamera 拖至 Button 的 Inspector 面板的 OnClick 下.
點(diǎn)擊 No Function 選擇 UnityAndroidTest(也就是我們剛剛創(chuàng)建的腳本)-> SendToast()
新建一個 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)境.
點(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è)置應(yīng)用的名字,設(shè)置好簽名以及最低兼容的版本 Android 4.1 和默認(rèn)最高的目標(biāo)版本.
準(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ā)送到屏幕上.
到此 Unity 和 Android 的交互就完成了.比起 iOS 的交互, Android 的交互繁瑣了許多.
第一次寫技術(shù)文檔,寫的不好的地方請多多指教.