前往
大廳
主題

Unity嵌入至Android筆記分享

pudding | 2021-07-22 02:01:36 | 巴幣 20 | 人氣 1256

不知道各位有沒有過要把Unity嵌入到其他App的時候,你可以想像成是把整個Unity的內容變成像是一個可放到其他原生App中的套件,在後者之中開啟Unity視窗。
近期由於工作上需要的關係,我研究了將Unity嵌入到Android和iOS原生App當中的方法,今天就讓我們來看看基礎的Android嵌入作法吧。

(參考資料)
影片參考:

首先,為了要能夠跟Android那邊溝通,我們會需要先能存取Android的程式 (?
或著更精確來說,取得AndroidJavaObject,也就是Java程式中的物件在Unity這邊看到的類別。

上圖中我們特別寫說在Android環境下有一個可以取得當前AndroidJavaObject的函式,從AndroidStudio那邊來看的話,這行程式碼會讓我們取得UnityPlayerActivity.java (Unity在AndroidStudio那邊所代表的視窗)

接著我們再加一些程式碼,但是晚點再解釋其功用,先加上以避免等一下又要重新匯出

然後去場景裡把參照拉一拉

拉完後我們就可以來準備匯出了
特別注意要去把Scripting Backend調成IL2CPP,另外Target Architectures也要勾選ARM64 (雖然我還沒試過不這麼做會發生什麼事)
然後原本的Build改成Export

匯出後用Android Studio開啟該匯出檔案,找到UnityPlayerActivity.java後加入給Unity那邊呼叫的函式

然後另外再把AndroidManifest.xml當中的intent-filter區塊拿掉
我不太確定原本這一段的意思,不過如果你不拿掉的話之後你會安裝到手機上時會出現兩個檔案

做完修改後讓我們開啟一個原生的Android專案
(這邊我後來是選擇使用Empty Activity當作初始模板)

進來後先到Settings.gradle之中額外加入這幾行程式
include':unityLibrary'
project(':unityLibrary').projectDir= new File('匯出檔之unityLibrary的絕對路徑')

接著再開啟build.gradle(Module: app),在其中的dependencies區塊中加入以下幾行程式
implementation project(':unityLibrary')implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])

最後再開啟build.gradle(Project: 原生專案名稱),在其中allprojects{repositories{ 區塊底下加入這幾行程式

全部加好後按下Sync Project with Gradle Files,這可以幫你處理一些匯出相關的雜事,不過各位現在按下的時候應該會先看到一個錯誤

這個錯誤依照該討論中看到的解法,在你的gradle.properties中加入這一行
unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist

接著應該就能正常進行gradle sync,做完後下一步我們先來製作簡單的Android Studio場景

準備了文字輸入框以及按鈕後,接下來就該準備實際來讀取其中的資訊了 (下圖21行~35行)

寫完後接著就可以來輸出一次看看,各位應該會在要按下 "GO TO UNITY" 按鈕時發生以下錯誤

該錯誤從Android Studio的Logcat視窗中可以找到一些資訊 (雖然會有點難找,因為Logcat的內容會一直跑)
貼去搜尋後我後來找到了以下這串討論

得知原生的Android Studio專案缺少了這行程式碼

我們要去找到Strings.xml然後加入
<string name="game_view_content_description" translatable="false">Game view</string>

讓我們看看實際運作的效果

我們回頭看一下先前為了相互溝通而加的程式碼,在Unity這邊要送訊息給Android時,我們會先用到先前提的GetAndroidCurrentActivity(),對當前的Activity(也就是UnityPlayerActivity.java)進行呼叫
Unity這邊沒辦法直接得知Android那邊會有什麼函式,得用Call("函式名稱")的方式來呼叫,後面則可以帶入參數
而如果還額外需要取得Android那邊回傳資料的話,則可以在Call後面加上<回傳資料之型態>

看完Unity之後再回頭看看AndroidStudio那邊寫的函式 (Unity匯出檔)
在Unity匯出的專案中找到UnityPlayerAcitvity.java,加入剛才我們在Unity當中呼叫的兩個函式 (注意名稱和大小寫)
第一個getMsgFromUnity會在被呼叫時將輸入的字串以Toast(Android系統的彈出式訊息框)的方式顯示
第二個則會從Intent中找到標註為MESSAGE_FOR_UNITY的資料,這一部分我們就可以接著繼續看到原生AndroidStudio專案中的程式碼

看到toUnityBtn按鈕的onClick事件中,這裡在呼叫Intent前先填入了預計要傳給Unity的字串
如此一來就能夠達到以下的效果


好了,以上就是簡單的將Unity嵌入至Android的方法,希望有幫助到大家W 下一次我再試著整理iOS的嵌入方法,不得不說,後者的麻煩程度比Android還要高出許多 (主要也是因為我不熟iOS的開發環境) ,希望我能順利寫出來了QwQ

創作回應

IORI9100
請問大大 要嵌入unity的話 unity部份的設計是否要用 unity開發軟體才行?
2022-02-22 16:21:30
pudding
就我所知的話Unity的部分就得用Unity做才行
2022-03-03 02:07:12

更多創作