Unity和Android交互(持續(xù)更新)

本文說明

  • 技術(shù)在更新迭代,舊的文章給大家的幫助已經(jīng)捉襟見肘。
  • 作為一個Unity程序員裙顽,總會遇到原生接入sdk的這個問題,本文作為Unity和Android交互的基礎(chǔ)教程喂分,默認(rèn)觀看者有 Android稍微懂一點點的知識(讀過《第一行代碼》這本書的前兩章)
  • 本文為Unity原生開發(fā)锦庸,即AndroidStudio打成aar包放到Unity中。如果想看Unity二次開發(fā)蒲祈,即Unity生成Android包放到Android中甘萧,請看我的另一篇文章Unity接入谷歌支付
  • 本文會持續(xù)更新交互的最新步驟,接入sdk時所遇到的坑點
  • 純原創(chuàng)梆掸,轉(zhuǎn)載請注明出自簡書

工具

  • Unity4.6.2f1
  • AndroidStudio2.3.3
  • AndroidSDK
    -- build-tools:26.0.1
    -- platform-tools:26.0.0
    -- tools:24.3.3(這里我采用低版本扬卷,高版本Unity生成apk的時候可能會有錯誤)
    坑點最好不要使用build-tools24版本的,否則Unity那邊可能出問題

Unity3D實際操作

1.首先用NGUI創(chuàng)建一個Button(重命名為ZFB)和一個Text(重命名為Message

結(jié)果圖酸钦,相信有點Unity基礎(chǔ)就可以明白

2.然后創(chuàng)建一個空物體怪得,重命名為Manager。其上掛載一個新腳本卑硫,名為PayManager徒恋。代碼內(nèi)容如下
PayMananger.cs

  • jo.Call("pay") 此方法會喚起Android端,pay是一會我們要在Android端添加的方法
  • Message() 以本文為例欢伏,我們會在Android端調(diào)用支付寶支付功能入挣,當(dāng)支付成功或支付失敗會返回消息到我們的Unity端,Message就是用來接收這個消息的硝拧,我們將支付結(jié)果打印到屏幕中的Text中

Unity這邊暫時告一段落径筏,在Adnroid端代碼寫好之后,我們還會回到Unity這里簡單配置

AndroidStudio實際操作

在本文我們主要演示Unity如何調(diào)用Android方法障陶,Android又是如何將消息反饋給Unity
1.創(chuàng)建一個新項目滋恬,接下來依次點擊紅圈中的按鈕


2.建好項目后我們需要導(dǎo)入一個unity的jar包。路徑是(以我自己的安裝路徑為基準(zhǔn)):
D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 抱究。
然后把路徑下的classes.jar包復(fù)制進(jìn)libs文件夾下恢氯,然后編譯重載下(右鍵Add As Library...
3.然后修改build.gradle,切換為Project視角,然后選擇app中的build.gradle勋拟,libs文件夾中的alipay-20170725.jar為支付寶的jar包遏暴,請忽略
Project視圖

4.將apply plugin: 'com.android.application'改成apply plugin: 'com.android.library',因為android studio會在這種格式下導(dǎo)出unity需要使用的aar或者jar文件指黎。然后刪除defaultConfig下的這行applicationId "com.example.com.exporttounity"朋凉,最后顯示為
build.gradle

5.FirstActivity腳本,讓這個類繼承我們的UnityPlayerActivity
初始化

6.添加Android中的pay方法醋安,還記得之前我們在Unity代碼中的jo.Call("pay")
pay
在Unity中點擊支付寶按鈕之后就會執(zhí)行Android中的pay方法(這段代碼的意思是調(diào)用支付寶界面杂彭,大家可以忽略,以后講Unity接入支付寶支付功能的時候會詳細(xì)講解)吓揪。這個方法可以接收Unity傳過來的參數(shù)亲怠,當(dāng)然我們這里沒用到就不過多描述了,現(xiàn)在我們已經(jīng)完成了Unity調(diào)用Android方法柠辞,那么如何從Android傳遞消息到Unity中呢团秽?

7.下面這段代碼會在我們使用支付寶購買商品成功或失敗之后執(zhí)行


UnityPlayer.UnitySendMessage("Manager","Message","傳到Unity中的消息")
第一個參數(shù)“Manager”: 根據(jù)Unity填寫。這里要填寫包含了Message方法的腳本所依賴的組件名
第二個參數(shù)“Message”:根據(jù)Unity填寫叭首。這里要填寫我們在PayManager.cs中添加的接收消息的方法名
第三個參數(shù)“string類型”:任意字符串习勤。這里要添加我們自定義的字符串
8.最后我們配置一下我們的AndroidManifest文件
AndroidManifest

  • 修改主題格式為android:theme="@android:style/Theme.NoTitleBar">
  • <activity android:name=".FirstActivity">修改為<activity android:name="com.first.sc.firsttest.FirstActivity">,防止在unity中導(dǎo)出的app與AndroidManifest中的包名不一致產(chǎn)生的問題
  • 然后添加<meta-data>信息,<meta-data android:name="unityplayer.UnityActivity" android:value="true" />否則在 Unity 導(dǎo)出 APK 時會報找不到manifest 文件的錯誤信息

9.利用AndroidStudio一步生成aar文件

點擊build-->build apk焙格,然后在app-->build-->outputs-->aar目錄下的到app-debug.aar文件

最終配置

1.app-debug.aar其實就是個壓縮包图毕,用解壓縮工具打開之后

app-debug.aar
刪除libs文件夾下的classes.jar,這個jar包是我們一開始Unity復(fù)制到Android中的眷唉。而我們會發(fā)現(xiàn)上圖中還有一個classes.jar予颤,這個是我們項目生成的jar包,我們這里暫時叫它項目jar包(如果aar壓縮包里面的AndroidMainfest文件中的icon和label屬性和我們的有沖突冬阳,就必須刪掉相關(guān)的屬性蛤虐,盡量所有的包名一致避免不必要的沖突)
2.在Unity項目根目錄下創(chuàng)建Plugins/Android文件夾,然后將app-debug.aarAndroidMainfest放入

3.將scene保存肝陪,然后點擊file-->build settings驳庭,選擇platform為android,然后點擊switch platform见坑,同時將要導(dǎo)出的scene add進(jìn)來嚷掠。

4.然后點擊player settings進(jìn)行一些apk導(dǎo)出的設(shè)置捏检。
這里我們設(shè)置apk的名稱荞驴,絕對不能按照默認(rèn)的寫
這里我們設(shè)置包名為com.first.sc.firsttest。設(shè)置Android最低版本與Android項目設(shè)置的minSdkVersion 15保持一致

5.點擊build導(dǎo)出apk贯城。(SDK和JDK提前設(shè)置好)如果你一切配置正確熊楼,會直接生成apk文件,但是這步很容易出現(xiàn)以下問題。
比如

  • 忘記刪掉libs下的classes.jar
  • Unity會說找不到你drawable中的icon.png鲫骗,可是你明明有這個文件犬耻,也有這個圖標(biāo)
    這個時候給你提供一種思路,如果你遇到類似的問題执泰,將aar包中的東西提前出來枕磁。就拿我們這里來說,將res文件夾术吝,libs文件夾计济,classes.jar放到libs文件夾下(也就是項目jar包),AndroidManifest文件放到我們的Plugins/Android文件夾下
    Android文件夾

效果展示





新增

  • 在Unity中調(diào)用安卓Toast(2018.2.18 Add)
    有的時候我們游戲項目如果僅僅想使用Toast排苍,卻不想創(chuàng)建安卓工程沦寂,那么完全可以用Unity提供的類實現(xiàn)
    Unity中調(diào)用Toast
  1. AndroidJavaClass對應(yīng)著Android里面的Java類,而AndroidJavaObject對應(yīng)著Android里面實例化的對象淘衙。
  2. AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", str.ToString());
    第一個參數(shù): 因為AndroidJavaObject對應(yīng)的是實例對象传藏,所以用new方法給其初始化時要說明其是哪個類的實例對象。
    第二個參數(shù):要傳遞的c#字符串的值

    Toast中要傳遞的消息是C#類型的string彤守,如果有報錯毯侦,可以根據(jù)這行代碼轉(zhuǎn)化為Java的String類型再傳遞。因為C#里的String和Java的String不是一碼事具垫,所以調(diào)用Android方法時如果需要傳字符串為參數(shù)時叫惊,有可能不能直接傳遞字符串,而是給個Java里的String做修,new AndroidJavaObject("java.lang.String","你想傳的字符串");可以轉(zhuǎn)換為Java類型
  3. 由于AndroidJavaClass對應(yīng)的是類霍狰,所以一般用之來調(diào)用對應(yīng)的類的靜態(tài)變量(GetStatic<Type>)或者靜態(tài)方法(CallStatic<Type>("functionName",param1,param2,....));其中的Type為返回類型,注意是Java的返回類型不是C#的饰及,一般整型和布爾型是通用的蔗坯,其他的如果不清楚可以統(tǒng)一寫返回類型為AndroidJavaObject,當(dāng)然沒有返回類型的不需要寫Type燎含。

結(jié)語

Unity和Android交互的基礎(chǔ)就到這里了宾濒,感謝您抽出時間閱讀,如果覺得我哪里沒有寫詳細(xì)或者我哪里寫的不對屏箍,歡迎評論指出绘梦,一定及時改成,給大家一個完整的技術(shù)文章赴魁。
即將推出Unity接入支付寶 Unity接入微信等文章卸奉,都介于本文基礎(chǔ)之上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颖御,隨后出現(xiàn)的幾起案子榄棵,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疹鳄,死亡現(xiàn)場離奇詭異拧略,居然都是意外死亡,警方通過查閱死者的電腦和手機瘪弓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門垫蛆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腺怯,你說我怎么就攤上這事月褥。” “怎么了瓢喉?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵宁赤,是天一觀的道長。 經(jīng)常有香客問我栓票,道長决左,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任走贪,我火速辦了婚禮佛猛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坠狡。我一直安慰自己继找,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布逃沿。 她就那樣靜靜地躺著婴渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凯亮。 梳的紋絲不亂的頭發(fā)上边臼,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音假消,去河邊找鬼柠并。 笑死,一個胖子當(dāng)著我的面吹牛富拗,可吹牛的內(nèi)容都是我干的臼予。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啃沪,長吁一口氣:“原來是場噩夢啊……” “哼粘拾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谅阿,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤半哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后签餐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寓涨,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年氯檐,在試婚紗的時候發(fā)現(xiàn)自己被綠了戒良。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠摄,死狀恐怖糯崎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情河泳,我是刑警寧澤沃呢,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拆挥,受9級特大地震影響薄霜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纸兔,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一惰瓜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汉矿,春花似錦崎坊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赋续,卻和暖如春打月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚕捉。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工奏篙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迫淹。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓秘通,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敛熬。 傳聞我的和親對象是個殘疾皇子肺稀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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