Unity3d Android SDK接入解析(二)Unity3d Android SDK的設計與兩種接入方式
一、前言
上篇說清楚了Unity和Android呼叫的方式,但很多實際接入的部分沒有講的很詳細,因為重頭在這篇,會詳細講述具體接入Android SDK的方式,和怎麼去做一個方便Unity接入的SDK。
傳送門:
前篇:Unity3d 與 Android之間的互相呼叫
http://blog.csdn.net/yang8456211/article/details/51331358
後篇:Unity3d Android SDK接入解析(三)接入Android Library的理解
http://blog.csdn.net/yang8456211/article/details/51435465
終篇:Unity3d Android SDK接入解析(四)通用的Android SDK接入中介軟體
http://blog.csdn.net/yang8456211/article/details/52231305
二、中篇:Unity3d Android SDK的設計與兩種接入方式
(Android SDK的接入一般分為兩種)
1)一種是把Unity的工程匯出google project的形式進行接入
2)另一種是通過把Android的工程做成Plugins的形式進行接入
對比:
類別(形式) google project U3d Plugins
優點 容易理解、方便接入原生SDK、幾乎所有SDK都可以接入 接入方便、容易在Unity中進行擴充套件與管理
缺點 接入比較繁瑣,對U3d專案不友好 不是所有SDK都提供U3d Plugins形式
apk匯出 Android IDE匯出 Unity 匯出
建議:
如果做一個sdk,還是推薦分開Android形式的SDK(可以是Library),與Unity3d形式的SDK(Plugins),因為一般專案會有自己的SDK架構,而讓他們打破這個架構,匯出Google project的形式進行接入,這無疑是很難被接受的。
下面我們就來說一下具體的操作:
首先我們會自己寫一個SDK,並說明白其中的注意點,然後會用兩種方式接入這個SDK。
1
2.1 一個簡單Android SDK
這個SDK實現幾個小功能,實現四個方法:
init方法,用來傳入上下文
傳入兩個數返回他們的和
傳入msg,彈出一個Toast提示
彈出一個提示視窗,視窗需要的文字資訊從strings.xml裡面獲取,點選確認關閉
先回答一個可能困惑大家問題:
1)實現SDK時一定要存在一箇中介軟體Activity繼承UnityPlayerActivity嗎?
網上幾乎所有教程都是這樣教的,新建一個MyActivity,然後繼承UnityPlayerActivity,在MyActivity裡面寫介面,然而根本沒有講清楚為什麼要這樣做。。
有關於這種方式的一些研究請看前篇:
http://blog.csdn.net/yang8456211/article/details/51331358。
2)讓我們拋棄MyActivity吧
對於1)的問題,答案是NO,簡單說一下我的理解,只有當需要在Activity的生命週期中執行一些操作時,我們才需要一箇中間Activity去完成這些與生命週期相關的操作,而其他情況下,一個Class足以。那就讓我們開始吧:
新建一個Android Project callAndroid
刪除其中MainActivity和activity_main.xml
新建一個Java class 取名CallMethod,寫好上述四個方法。(可以自己先寫寫,然後看跟我寫的有什麼不一樣)
public class CallMethod {
private static Context unityContext;
private static Activity unityActivity;
private static AlertDialog.Builder alert;
//init方法,用來傳入上下文
public static void init(Context paramContext){
unityContext = paramContext.getApplicationContext();
unityActivity = (Activity) paramContext;
}
//傳入兩個數返回他們的和
public static int add(int arg0, int arg1){
return arg0 + arg1;
}
//傳入msg,彈出一個Toast提示
public static void showMessage(final String msg){
unityActivity.runOnUiThread(new Runnable()
{
public void run()
{
Toast.makeText(unityContext,msg, Toast.LENGTH_LONG).show();
}
});
}
//彈出一個提示視窗,視窗需要的文字資訊從strings.xml裡面獲取,點選確認關閉
public static void showAlertView(){
alert = new AlertDialog.Builder(unityActivity).setTitle("彈出視窗").setMessage(unityContext.getResources().getIdentifier("msgAlert", "string", unityContext.getPackageName())).setPositiveButton("確認", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
unityActivity.finish();
}
});
unityActivity.runOnUiThread(new Runnable()
{
public void run()
{
alert.show();
}
});
}
}
這一小段程式碼,含金量可不小,能解決絕大部分你所遇到的問題~
1. 不使用Activity,那Activity上下文怎麼來?
使用init的方法讓Unity傳當前上下文進來,我們就能拿到當前的Activity和應用上下文。(至於Unity怎麼拿上下文,前篇我沒有明確指出,但是我是有提的~請保持思考!)
2. 怎麼彈出視窗?怎麼對介面進行操作?
Unity呼叫Android方法預設不是在UI主執行緒上執行的,所以如果你想要對UI介面進行操作,那就要使用runOnUiThread才行。
3. 使用Plugins接入的時候,怎麼才能讀到R的資源?
這個問題困擾了我挺久的,因為直接把libs放入到Plugins中會導致讀取不到資源,最後是通過反編譯各種第三方SDK,才找到方法。此處是通過unityContext.getResources().getIdentifier(“msgAlert”, “string”, unityContext.getPackageName())這種java反射機制獲取。(這裡是獲取了一個string,類比其他)
4. 只能使用靜態方法嗎?
當然不是,也可以使用例項方法,只是靜態方法更容易呼叫,想要使用例項方法,我們可以建立一個單例,然後使用這個單例去呼叫例項方法。
private static CallMethod invokeSingleTon = null;
public static CallMethod getInvokeClass(){
if (invokeSingleTon == null){
invokeSingleTon = new CallMethod();
}
return invokeSingleTon;
}
public void sayhello(){
//方法內容
}
3)怎麼釋出我們的SDK呢?
此時我們就已經寫好了我們的SDK,這個SDK比較健壯,怎麼釋出都行,可以勾上isLibrary以Android的庫檔案的形式進行釋出;也可以分離出jar和res,以程式碼和資源的方式進行釋出。
2.2 一個簡單Unity工程
在寫完AndroidSDK之後,我們簡單的寫一個Unity的工程,用來呼叫Android設定的介面。
首先建立一個空的Unity工程,命名為UnityCall
選中攝像機MainCamera,新建一個CS指令碼callAnd
繫結到Main Camera
選中Main Camera,在add component的地方,選擇剛才寫的callAnd指令碼
cs指令碼的程式碼:
AndroidJavaClass unityPlayer;
AndroidJavaObject currentActivity;
AndroidJavaClass androidCall;
void Start () {
//獲取context
unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
androidCall = new AndroidJavaClass("com.atany.callandroid.CallMethod");
androidCall.CallStatic("init",currentActivity);
}
void Update () {
}
void OnGUI()
{
GUI.skin.textArea.fontSize = 50;
GUI.skin.button.fontSize = 50;
// add
if(GUI.Button(new Rect(100,300,450,300),"add"))
{
int sum = androidCall.CallStatic<int>("add",1,2);
print ("sum is "+ sum);
}
// showMessage
if(GUI.Button(new Rect(600,300,450,300),"showMessage"))
{
androidCall.CallStatic("showMessage","顯示這一段的文字");
}
// showAlertView
if(GUI.Button(new Rect(100,700,450,300),"showAlertView"))
{
androidCall.CallStatic("showAlertView");
}
}
畫了三個button,用於呼叫我們設定好的Android三個不同的功能。
2.3 匯出Android工程進行接入
首先呢,我們就先試一試匯出Android工程的接入形式,把我們的Unity工程匯出,然後接入我們的Android SDK。
匯出Android 工程(快捷鍵 Shift+Ctrl+b調出Build Settings)
匯入到IDE 這裡使用eclipse,當然Idea也是一樣的
注意:這裡一定要選Existing Android Code Into Workspace,不要選Existing projects into Workspace
我們把Android SDK打成jar+res(就一個stringnew.xml)的形式釋出,加入到Unity匯出的工程中。
-可以看到,我們就加入了兩個東西,一個jar和一個xml,讓我們跑起來看看效果
add:
點選add成功收到Unity3d列印的返回值。
showMessage:
點選showMessage,成功在當前介面顯示了toast。
showAlertView:
點選showAlertView,成功在介面彈出了對話方塊
OK,到這裡我使用匯出google project的方法實現的android sdk的接入!也說明我們的資源讀取的方式是正確的(取到stringnew裡面的字串資源),能夠彈出對話方塊和Toast就意味著你能夠實現各種視覺化的介面操作。接著,我們看看怎麼使用Unity外掛的形式進行接入。
2.4 使用Unity外掛形式進行接入
這種形式更加簡單,簡而言之就是以U3d要求的一種形式放好你的資源和jar包,然後就能夠執行了~
構建Plugins的形式
我們還是用之前新建的U3d的工程,記得開始的時候我們只新增了一個指令碼,現在我們要在assets下面建立如下的結構:
Plugins:assets 下的根目錄(下面可能有Android或者IOS)
Android:主目錄
bin:放中介軟體的工程(我們沒有建立MyActivity的中介軟體,如果有的話放在這裡)
libs:放所有jar包
res:放所需要的資源
放入我們剛匯出的Android SDK的libs和res
注意:
1.callAndroid的jar是放在libs裡面的,stringnew這個xml是放在values裡面的,我是通過多選讓大家看看我新增的所有檔案
2.如果bin裡面有加入中介軟體MyActivity,或者有需要新增的許可權以及Android的元件,需要放入AndroidManifest到Android目錄下。
執行效果和匯出google project的效果是一樣的,我就不重新貼圖貼一次了。
總結:
如果你跟著我做完了,你應該理解到的內容:
1. 正確的完成一個方便Unity接入的SDK
2. 使用匯出工程的模式完成SDK的接入
3. 使用Unity外掛的形式進行Android的接入
後篇我會講講具體的例子,怎麼接入一個具體的Android的Library工程。
三、demo地址
Android接入demo分為三個工程:
UnityCall:Plugins形式的Unity3d的工程
EclipseProj:Android的兩個工程
UnityPlayerNativeActivity:Unity3d匯出式的工程
callAndroid:Android的sdk工程
---------------------
相關文章
- Unity3d Android SDK接入解析(一)Unity3d 與 Android之間的互相呼叫Unity3DAndroid
- SMSSDK的Unity3D的兩種整合方式-AndroidUnity3DAndroid
- 手把手教你接入華為分析的Android SDKAndroid
- 影片SDK開發,多平臺SDK快速接入
- SMSSDK的Unity3D的兩種整合方式Unity3D
- 以美顏sdk為例,詳解sdk接入流程
- Unity3D整合騰訊語音GVoice SDKUnity3D
- Android APIs (Class Index - Android SDK)(二)AndroidAPIIndex
- unity3d與android互動Unity3DAndroid
- 社會化登入分享-QQ SDK接入
- 社會化登入分享-微信SDK接入
- 【Android SDK】在命令列管理Android SDKAndroid命令列
- Semantic Kernel/C#:接入智譜AI的兩種方式C#AI
- 微信 WCDB for Android 的接入Android
- FCM伺服器 admin-SDK接入指引伺服器
- 社會化登入分享-新浪微博 SDK接入
- Android中應用是否可以接入微信SDK分享應用內的短視訊功能?Android
- 直播平臺怎麼接入美顏sdk?直播美顏sdk在哪裡找?
- weex原始碼解析(四)- android引入sdk原始碼Android
- 接入 paypal PHP-sdk 支付 / 回撥 / 退款全流程PHP
- 微信小程式之:小程式接入高德地圖SDK微信小程式地圖
- 鴻蒙Next-支付寶SDK接入教程鴻蒙
- Android AppLinks 接入AndroidAPP
- weex與android互動初步接入,遇到的坑Android
- android sdk更新代理。Android
- Android SDK Tools 更新Android
- Set up the Android SDKAndroid
- 接入第三方美顏sdk和自主開發美顏sdk如何選擇?
- Android SDK無法更新終極解決方式Android
- 如何正確的在專案中接入微信JS-SDKJS
- 平臺接入美顏SDK工具有哪些需要注意的地方?
- Android Pie SDK 與 Kotlin 更合拍AndroidKotlin
- 原生Android工程接入Flutter aarAndroidFlutter
- Android工程接入UnityLibrary工程AndroidUnity
- iOS接入微信SDK報錯'NSInvalidArgumentException', reason ' [__NSArrayM enqueuiOSExceptionENQ
- 限流 SDK 的設計與實現
- 美顏sdk對直播平臺有多重要?為什麼需要接入直播美顏sdk?
- 直播平臺需要接入美顏SDK嗎?直播美顏SDK為什麼要區分版本?