1. 程式人生 > >Android Studio 與 Unity3d互動。歸納版。

Android Studio 與 Unity3d互動。歸納版。

本來想自己整理下,發現有人整理了,直接搬運過來了。備忘。

原址:http://blog.csdn.net/u014230923/article/details/51363556

這次部落格講解 Android Studio 怎麼匯出專案到 Unity。 
在這裡先吐槽一下天朝的防火牆,國內資料真的少,只有科學上網去查詢各種資料,幸苦了一天總算能夠正常使用了。 
官網其實也有教程,只不過有點難看懂,還全是英文的,而且好像是使用Eclipse(猜的),地址是http://docs.unity3d.com/Manual/PluginsForAndroid.html 
這裡我就介紹AS的建立方法吧。用AS新建一個工程,建議不熟的朋友和我一起使用相同的包名等。 
工程名: 
這裡寫圖片描述

我的手機是魅藍note2作業系統是5.1的,所以我選5.1,大家如果不是的話。選擇自己的就行了,但建議不要用太低的,因為Unity貌似不支援4.0以前的(沒嘗試過)。 
這裡寫圖片描述

選擇空工程 
這裡寫圖片描述

然後Next –> Finish 就行了。 
建好專案後我們需要匯入一個unity提供的jar包。路徑是(以我自己的安裝路徑): 
I:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 
unity新版本的jar包位置就是這裡。Mac的請大家對應著找就行了,因為我沒有Mac!! 
切換 AS 的專案檢視為Project,把路徑下的classes.jar包複製進libs資料夾下 
這裡寫圖片描述

點選這個按鈕,讓AS重新載入(編譯一下包) 
這裡寫圖片描述

載入完後就要開始修改程式碼了。首先修改MainActivity 繼承自 UnityPlayerActivity 
這裡寫圖片描述

由於我們要讓AS把工程打包,供Unity使用,所以要修改一下Gradle,雙擊 build.gradle 
這裡寫圖片描述 
我圈出了需要修改的地方 
這裡寫圖片描述

application —>library 
applicationId 這一行刪掉

如圖 
這裡寫圖片描述

然後再點選,讓他重新載入/編譯包。。 
這裡寫圖片描述

由於打包後就不由Gradle來構建專案了,所以還要修改一下 AndroidManifest 和res資料夾 
這裡寫圖片描述

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.com.exporttounity"> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

這裡寫圖片描述

最後在修改main_activity.xml 
這裡寫圖片描述

現在應該就可以了,點選 
這裡寫圖片描述 
構建好後會彈出提示,點選在資料夾中顯示 
這裡寫圖片描述

找不到的可以在專案目錄下找,以我自己的為例 
D:\vrTest\ExportToUnity\app\build 
然後進入outputs–>aar 資料夾,就有打包好的檔案了,這個*.arr 是AS的打包檔案,好像它不支援打包jar還是什麼的,我也不清楚,只要知道這個能用就行了。 
然後開啟Unity 新建一個專案,這裡我就新建3D專案了 名為ImportAndroidStudioARR,新建 Plugins->Android 這樣的目錄,把.arr檔案和AS裡的AndroidManifest放進去 
這裡寫圖片描述 
新建一個小場景,並儲存 
這裡寫圖片描述

點選File –> Build Setting,選擇Android,switch platform,點選Player Setting 
 
不能有大寫

這裡最好從AS的AndroidManifest下的package那裡複製來。 
這裡寫圖片描述

這裡修改成我們建立安卓專案時指定的最小API 

然後就好了,連上手機,點選 Build And Run 選擇apk的位置,然後等待就可以了。 
但是,現在他報錯了!! 
這裡寫圖片描述
這個錯有點坑,網上找了很多都沒找到解決辦法,唯一的解釋就是說有的jar包重複引用了或者重名了,但明明我們就沒有引用其他的包!!於是我就想到是不是AS打包時重複了,於是用壓縮軟體開啟.arr包,發現是這樣的 
這裡寫圖片描述 
並沒有重複啊!!於是繼續開啟,直到開啟libs 
這裡寫圖片描述 
還真有!! 
最後實踐證明需要刪掉libs下的classes, 
刪掉後,重新匯入.arr包,繼續Build。現在終於不報錯了。但是為毛顯示的畫面不是想象中的啊!!想想為什麼是這個。。最後我們發現原來是AS中的MainActivity這裡指定了開啟時顯示的畫面, 
這裡寫圖片描述 
把這行註釋掉,然後重新打包,刪掉libs下的classes,引入,最好把AndroidManifest也重新引入一下,最後Build,這下終於可以了!! 
最後附上一張成功截圖這裡寫圖片描述 
結束。

專案工程在下一篇部落格中。


我們接著上一篇部落格的內容,接著講Android 和unity 的互動。上一篇我們講到利用Android Studio 怎樣建立一個工程,打包成ARR檔案匯入到Unity,在通過Unity打包成APK,安裝到手機上可以看見Unity攝像機的畫面。如果不清楚的可以看我的上一篇部落格 
http://blog.csdn.net/u014230923/article/details/51363556 
接下來我們繼續瞭解,在Unity中怎麼呼叫Activity中的方法。先把Unity和AS都開啟,並且選擇到上一篇部落格建立好的專案那裡。 
既然是要呼叫Activity中的方法,那肯定要在其中建立一個可以呼叫的方法,開啟AS修改MainActivity:

public void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在MainActivity中新增這樣一個方法,學過android的朋友應該都知道,這是一個顯示一條提示的方法。對於android的基礎,我就不在這講了,因為我也不太會。在這裡建議大家,就算是學習Unity,也還是需要了解一下Android的基礎比較好,因為現在Unity還是開發的手遊比較多,就算大家不開發手遊,我覺得了解一下也沒有壞處。如果大家沒學過的話,入門比較快的,也是公認的寫的很好的一本書叫做“第一行程式碼”,這本書能帶你比較快速入門。 
好,接下來繼續講解。然後按照上一篇部落格的內容,打包,新增到Unity。Activity修改好後,我們修改Unity中的程式碼。現在場景中新增一個按鈕,用來點選呼叫方法。 
這裡寫圖片描述

就這樣簡單弄一下就行了。UI的適配大家自己弄一下。然後,給按鈕新增點選事件,我們還沒寫過程式碼,好吧,現在新建一個Scripts資料夾,新建一個Show Message指令碼給按鈕新增,然後編輯指令碼:

using UnityEngine;
using System.Collections;

public class ShowMessage : MonoBehaviour {

    public void BtnShwMessage ()
    {
        //通過檢視原始碼,我們可以發現UnityPlayer這個類可以獲取當前的Activity
        //幫助手冊上 AndroidJavaClass:通過指定類名可以構造出一個類
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        //currentActivity字串對應原始碼中UnityPlayer類下 的 Activity 變數名。
        //通過構造出的Activity根據字串獲取物件
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        //根據方法名呼叫方法,傳入一個引數陣列,這裡我們只有一個,就只傳一個
        jo.Call("showToast", "Unity 呼叫了這個方法");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

這裡大家不理解也沒關係,只要知道

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

這個用來獲取當前的Activity,一般不用改,

jo.Call("showToast", "Unity 呼叫了這個方法"); 
是根據方法名呼叫Activity中的方法,傳入一個引數陣列就行了。

現在Build就可以在手機上顯示畫面了。這裡我在給大家推薦一個軟體 genymotion,這是android的虛擬機器,可以很大程度的模仿手機。至於安裝和使用教程,請大家自行百度。但是我現在是學生,校園網與它不相容,所以我就只能用手機檢視效果,但效果應該是一樣的。大家不必擔心。 
言歸正傳,現在雖然是在手機上運行了,但是點選並沒有效果,這是因為在android中有分層,UI執行序和非U執行序(具體請查資料,我也解釋不清楚)。在Unity中執行的就是非UI執行序,所以像 Toast 種UI的東西沒有辦法執行。一個比較簡易的解決辦法是:修改MainActivity:

public void showToast(final String msg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

現在重新打包,匯入,Build ,手機上是真正能夠有效果了。 
這裡寫圖片描述

專案工程:http://pan.baidu.com/s/1nuJ392p 
一個是Unity工程,另一個是AS工程。 
本部落格用作新手學習討論,如有不好或錯誤的地方也請指出來,謝謝。


近日因為工作的原因筆者開始接觸Unity3D遊戲引擎,該引擎的一大特色就是支援多種平臺,其中自然不能少了我們Android。在Unity3D和Android Studio互動中其實有不少坑,不過踩坑向來是學習的一部分,在這裡筆者和大家分享一下今天的踩坑經驗。

一、 將專案作為lib匯入Unity打包

Eclipse的時代說到打包那必然指的是JAR包,其缺點是res資原始檔不好處理,而隨著Android Studio一同到來的AAR包解決了這個問題。

將原始碼和資原始檔一同打包等到實際編譯的時候再解壓,這些事情Build Tool都幫我們做了,這也是為什麼Android Studio中我們只需一句話就能搞定依賴管理。在Unity3D工程中我們同樣能夠通過AAR來匯入Android部分的邏輯。

博文介紹瞭如何匯出AAR,但是在你真正將自己的專案移植的時候你仍然會遇到不少問題。如果你將自己的AAR包用壓縮軟體開啟時就會發現Build Tool似乎將你整個Module都打包進去,唯獨沒有打包的就是你的依賴!

比如你在Android中使用了ToolBar,RecyclerView等由support-v7提供的控制元件,或者類似xUtils3的第三方框架等,這些東西都是不會被打包進你的AAR中。我們必須手動將這些依賴的AAR一同新增到Unity3D工程。

大部分的第三方庫都會提供AAR包檔案,實在沒有也可以從GitHub上clone下來自己打包。Google官方提供的support庫等都可以在SDK目錄下的extras子目錄中找到,比如support-v7的AAR在如下位置可以找到:

v7包

看到這裡你以為就能順利完成往Unity3D匯入Android的工作嗎?

Naive,這裡還有兩個坑你沒跳呢!

如果你的SDK中存在版本為24的Build Tool的話會爆出錯誤:

Build-tools為24時的報錯截圖

具體原因可能是Build Tool的Bug。要解決的話很簡單,就是把24的Build Tool藏起來:

躲貓貓

到這裡你應該能夠順利地將Unity3D工程順利打包成APK。

這個時候如果你還覺得包的版本越高越好就會遇到第二個坑,這個坑在24號版本的support-v7包中。

報錯截圖如下:

報錯截圖

compile ‘com.android.support:appcompat-v7:24.x.x’只是一句依賴但是其匯入的包並不只有一個,如果你開啟module的build\intermediates\exploded-aar目錄去看的話就會發現其實他有4個包。報錯中提到的VectorDrawableCompat就在其中:

叛徒

然而這個時候就算你匯入了這兩個包問題依舊存在。

筆者猜測24的VectorDrawable包必須使用24的Build Tool來打包,而上面我們說過了24的Build Tool和Unity3D不太相容。

解決方案很簡單,就是使用23的support包。

筆者測試過使用23的support無需匯入VerctorDrawable可以正常執行。

1、 使用Gradle指令碼簡化導包操作

踩過以上的這些坑之後想必大家都已經掌握了新姿勢,但如果你像筆者一樣是個懶惰的程式設計師的話就會覺得,每次編譯都手動複製來複制去好麻煩啊,而通過Gradle的指令碼我們可以分分鐘解決這個問題。

以下是筆者寫的指令碼,當成虛擬碼來看的話相信有點經驗的開發者都能看懂:

// 刪除舊的aar
task deleteOldAar(type: Delete) {
    //刪除Unity工程下的Android資源
    delete '你的Unity3D工程/Assets/Plugins/Android/lib-release.aar'
    //由於AndroidManifest檔案可以能有更新,一併刪除
    delete '你的Unity3D工程/Assets/Plugins/Android/AndroidManifest.xml'
    //刪除Android工程下的編譯資源
    delete 'build/intermediates/bundles/release/'
    delete 'build/outputs/aar/lib-release.aar'
}

// 匯出AndroidManifest.xml
task exportManifest(type: Copy) {
    from('src/main/')
    into('你的Unity3D工程/Assets/Plugins/Android/')
    include('AndroidManifest.xml')
}

//匯出aar
task exportAar(type: Copy) {
    from('build/outputs/aar/')
    into('你的Unity3D工程/Assets/Plugins/Android/')
    include('lib-release.aar')
}

//新增任務依賴
exportAar.dependsOn(deleteOldAar, build, exportManifest)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

二、 將Unity作為lib匯入Android Studio

如果你實際將工程作為libs匯出的Unity3D匯出的話你會發現這種方法帶有太多的限制了:

  • 專案所在的Module必須為設為library 
    如果你的專案使用了比如xUtils中的基於註解和反射實現的檢視注入框架的話,你就會發現將module設定為library後框架的檢視注入功能就無法使用了,甚至連switch(view.getId())這樣的程式碼都用不了。究其原因無論是註解還是switch語句其需要引數都必須是常量,而library的R.id.xxx要在打包成apk的時候才能確定,於是開發者就不得不寫繁瑣的findViewById了。

  • 不方便管理依賴庫 
    如果專案依賴了某些庫那麼在打包的時候要一併將這些庫的jar/aar一併匯入到Unity目錄之中,升級依賴或者新增依賴全部都要手動進行。人為操作難免會出問題而Unity打包的速度也是慢的可以,每一次打包都像是在拷問著程式設計師一般。

如果反過來想,不是將工程匯出而是將Unity作為lib匯入到Android Studio的話這一切都將迎刃而解。

開啟Unity的IDE,通過File->Build Settings開啟打包設定 
打包設定

選中Google Android Project並且簽名(不簽名無法匯出工程,身為Android開發者我表示不解啊),匯出後我們就會看到Eclipse專案結構的工程,如下:

匯出工程結構

assets存放的是編譯後的Unity指令碼等東西,這部分是匯出部分的核心,日後如果要更新Unity的lib的話,只覆蓋assets下的東西就夠了。其他的部分相信大家都十分熟悉了,不再贅述。

我們將匯出的東西作為library匯入到Android Studio,build之後我們就能在module的輸出目錄下找到對應的AAR檔案了:

AAR位置

之後我們就可以直接使用AAR檔案進行開發了,是不是很方便。

1、 更新Unity的AAR

隨著專案的不斷研發Unity的部分總是需要更新的,如果匯出一個AAR要重複上述的步驟的話那依然是很麻煩的。好在我們可以繞過Android Studio直接更新AAR檔案。

如前文所說Unity匯出工程的核心都在Assets目錄下,而我們用壓縮軟體開啟對應的AAR檔案就會發現Assets下的內容只是被原封不動地打包進去了而已,所以我們完全可以用新匯出的Unity工程中的Assets來替換AAR包下的東西。

AAR開啟


[end]

相關推薦

Android Studio Unity3d互動歸納

本來想自己整理下,發現有人整理了,直接搬運過來了。備忘。 原址:http://blog.csdn.net/u014230923/article/details/51363556 這次部落格講解 Android Studio 怎麼匯出專案到 Unity。  在這

[轉]iOSUnity3d互動

前言 最近在實驗室做了一個專案,用到了藍芽通訊和U3D的互動,都有很多坑,如:IOS與Unity3D介面之間的跳轉,資料的傳遞等操作過程其實不是很難,只是比較繁瑣,剛開始可能一頭霧水,慢慢學習瞭解後,就會發現其實很簡單。 整篇文章主要介紹以下兩點 IOS與團結之間的介面切換 IOS與團結之間的函式呼叫以及傳

Android系列之SQLiteAndroid Studio的資料互動

一、把db放在res的下方創一個raw資料夾,裡面用來放db 二、創一個DbHelper類,實際程式碼如下: public class DbHelper extends SQLiteOpenHelper{ /** *

關於mac android studio svn 解除關聯後 無法再次share (Subversion) 的解決辦法

pre lac lan n) con oid directory ppi files Android studio 把工程share 到 svn 上面,可是一不小心忘了 ignore files 的設置,結果沒辦法,把svn 上的刪掉再重新share 一次,先接觸本地代碼與

Android studio導出AAR包問題整理

plugin java clas aar 快的 roi 使用 tput 進行 最近因為項目需求開始整理一個SDK 以AAR的方式提供出去。在整理的過程中遇到了很多坑。 以下是一些總結希望能幫助遇到同樣問題的人。 1.怎麽導出AAR,這種文章太多了,我貼一個大家可以做參考。

android studio 手機連接調試

too 連接方式 找到 other 手機屏幕 以及 網上 platform ngs android studio 版本不同 連接手機方式有細微的不同,主要方式相似。介紹主要分手機和電腦兩部分介紹。 一、手機部分 1、手機端下載一個“一鍵root權限獲取“,在安裝的過程中需要

Android Studio夜神模擬器的連結教程

1. 什麼是夜神模擬器?    夜神模擬器是北京多點線上科技有限公司開發的一款Android手機遊戲模擬器,    執行速度快,使用方便,是一款PC平臺玩手遊,助攻Android開發的利器 2. 使用Android Studio與夜神模擬器開發

Android annotations快速開發框架使用,Android StudioEclipse配置

Androidannotations框架是目前最火的Andorid端快速開發框架,通過註解方式挺高開發效率,減少重複編寫沒有技術含量的程式碼。       使用AndoridAnnotations框架的理由:      

Android Studio夜神模擬器開發除錯-初學者

使用Android Studio與夜神模擬器開發除錯 1.1 啟動android studio 1.2 啟動夜神模擬器 1.2.1 cmd開啟命令列視窗 1.2.3 執行命令連線模擬器 “D:\Program Files\Nox\bin”\nox_

Android studiowebstorm 通過GIT同步專案到碼雲

每次專案同步到git碼雲之後,都會好長一段時間不再新上傳專案,長時間不使用導致每次專案在新上傳時都會記不住使用步驟。在此記下,以作筆記。 Android studio 與 webstorm 等的操作步驟相同 在此以react native 專案為例。 首先在命令列進入專案的目錄 執行 r

擁抱 Android Studio 之二:Android Studio Gradle 深入

關於學習方式 曾經跟朋友討論過我們所接受過的大學工科教育,都是一上來先學基礎理論,最後再來一個金工實習。一開始不知道為什麼而學,學不進去,荒廢了基礎,等到金工實習的時候,又發現基礎不牢,後悔不已。 考慮到傳統教育方式的不足之處,筆者在組織本系列文章的時候是先講入門例項,進而

android java native互動 基礎學習(一)

javap 與javah的用法 javap 的用法: cd 到 class 所在的目錄: javap -classpath . -s Bean(類名) java h的用法一: native 所在的資料夾。ExampleUnitTest 資料夾所在的包

Android Studio Eclipse 快捷鍵對照及AS常用快捷鍵

Ctrl+D: 集合了複製和貼上兩個操作,如果有選中的部分就複製選中的部分,並在選中部分的後面 Ctrl+空格: 輸入程式碼時按此組合鍵會列出與之相匹配的類、方法名、成員變數等,起智慧提示的作用 Ctrl+向下箭頭 或Ctrl+向上箭頭:在有自動匹配下拉列表時,此快捷鍵會自動關掉下拉列表,游標移動到下/上一

android studio Plugins 所有外掛下載不成功

解決方式: window :file->settings->system settings->updates->  Use secure connection 去勾。 mac:preferences-> apprearance& be

android studio 手機連線除錯

android studio 版本不同 連線手機方式有細微的不同,主要方式相似。介紹主要分手機和電腦兩部分介紹。 一、手機部分 1、手機端下載一個“一鍵root許可權獲取“,在安裝的過程中需要安裝KingRoot,獲取手機root許可權。網上有些說法,說手機側不需要獲取ro

Android WebViewJS互動及訊息處理

一、WebView與JS互動 1.JS呼叫本地方法 這個功能的實現還是比較容易的。直接呼叫WebView的該方法就可以新增介面了,不過先要啟動互動 ? 1 2 3 4 // 啟用javascript  mWebView.getSettin

Android webViewjs 互動以及jsbridge框架原始碼分析

1.簡單篇 如何實現簡單的android 呼叫js 與js呼叫android 讓webview做一下操作 private void init(Context context){ WebSettings setting =

Android StudioAndroid SDK 線上更新的解決方案(1.3.2)

1、Android Studio更新 問題:在Android Studio中,點選help-Check for Update,會出現如下錯誤: 解決方案:開啟Android Studio的安裝目錄,

Android手機vr互動暴風魔鏡3D效果顯示原理

首先講到VR,談談個人體會,半年前看到淘寶上的vr眼鏡盒為了促銷標題圖片都是非常性感的,還有海量你懂得資源。到最近在淘寶搜尋vr暴風魔鏡都正規了,而且銷售量龐大 還有新聞上很多vr的科技前沿資訊可以看出來。vr技術隨時間的流逝正在日益發展成熟,就像曾經的諾基亞到安卓,蘋

Android Studio:如何使用Android Studio夜神模擬器開發除錯

1、什麼是夜神模擬器?     夜神模擬器是北京多點線上科技有限公司開發的一款Android手機遊戲模擬器,執行速度快,使用方便,是一款PC平臺玩手遊,助攻Android開發的利器,樣子如下所示: