本文說明
- 技術(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)
2.然后創(chuàng)建一個空物體怪得,重命名為Manager。其上掛載一個新腳本卑硫,名為PayManager徒恋。代碼內(nèi)容如下
- 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)建一個新項目滋恬,接下來依次點擊紅圈中的按鈕
D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes 抱究。
然后把路徑下的classes.jar包復(fù)制進(jìn)libs文件夾下恢氯,然后編譯重載下(右鍵Add As Library...)
4.將
apply plugin: 'com.android.application'
改成apply plugin: 'com.android.library'
,因為android studio會在這種格式下導(dǎo)出unity需要使用的aar或者jar文件指黎。然后刪除defaultConfig下的這行applicationId "com.example.com.exporttounity"
朋凉,最后顯示為5.FirstActivity腳本,讓這個類繼承我們的UnityPlayerActivity
6.添加Android中的pay方法醋安,還記得之前我們在Unity代碼中的jo.Call("pay")么
7.下面這段代碼會在我們使用支付寶購買商品成功或失敗之后執(zhí)行
UnityPlayer.UnitySendMessage("Manager","Message","傳到Unity中的消息")
第一個參數(shù)“Manager”: 根據(jù)Unity填寫。這里要填寫包含了Message方法的腳本所依賴的組件名
第二個參數(shù)“Message”:根據(jù)Unity填寫叭首。這里要填寫我們在PayManager.cs中添加的接收消息的方法名
第三個參數(shù)“string類型”:任意字符串习勤。這里要添加我們自定義的字符串
8.最后我們配置一下我們的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其實就是個壓縮包图毕,用解壓縮工具打開之后
2.在Unity項目根目錄下創(chuàng)建Plugins/Android文件夾,然后將app-debug.aar和AndroidMainfest放入
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)的寫
minSdkVersion 15
保持一致5.點擊build導(dǎo)出apk贯城。(SDK和JDK提前設(shè)置好)如果你一切配置正確熊楼,會直接生成apk文件,但是這步很容易出現(xiàn)以下問題。
比如
-
忘記刪掉libs下的classes.jar
- Unity會說找不到你drawable中的icon.png鲫骗,可是你明明有這個文件犬耻,也有這個圖標(biāo)
效果展示
新增
-
在Unity中調(diào)用安卓Toast(2018.2.18 Add)
有的時候我們游戲項目如果僅僅想使用Toast排苍,卻不想創(chuàng)建安卓工程沦寂,那么完全可以用Unity提供的類實現(xiàn)
- AndroidJavaClass對應(yīng)著Android里面的Java類,而AndroidJavaObject對應(yīng)著Android里面實例化的對象淘衙。
- 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類型- 由于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ǔ)之上