Unity同步/異步調(diào)用Android的方法實(shí)例
1 Unity如何使用Android插件
很簡(jiǎn)單,把a(bǔ)ndroid的模塊,打包成aar或者jar,放到Assets/Plugin/Android即可!
2 同步方法如何調(diào)用
2.1 例子1
Android端
假設(shè)Android有一個(gè)方法
public static String GetVideoParams() {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(LOCAL_VIDEO_PATH);
String width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); //寬
String height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); //高
Log.w(TAG, "GetVideoParams, width " + width + " height " + height);
return width +"_" + height;
}
Unity端
則Unity的C#腳本,可以這么寫:
AndroidJavaObject androidVideoPlugin = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.VideoPlugin");
String width_height = androidVideoPlugin.CallStatic<String>("GetVideoParams");
其中com.iqiyi.cutgreenvideosdk.VideoPlugin是Android方法的包名和類名。
CallStatic<String>即表示,調(diào)用某個(gè)類的靜態(tài)方法,且返回值是String。如果返回值要Int或者bool啥的,對(duì)應(yīng)修改即可,例如CallStatic< bool >。
2.2 例子2
Android端
Android有一個(gè)方法
public void start(Context context, int externalTextureId) {
....
}
這個(gè)不是靜態(tài)的方法了,但需要傳遞context對(duì)象。
Unity端
AndroidJavaObject androidVideoPlugin = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.VideoPlugin");
//get activity
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
androidVideoPlugin.Call("start", activity, 1);
Call后面是android端的方法名,以及參數(shù)。
3 異步方法如何調(diào)用
異步的話,可以這樣:
Unity發(fā)起調(diào)用,Android處理調(diào)用,并通過消息,通知給Unity。
具體而言。首先,Java是有辦法向C#發(fā)消息的:
UnityPlayer.UnitySendMessage
這個(gè)類的調(diào)用方式:
UnityPlayer.UnitySendMessage(“GameObjectName”, “MethodName”, “parameter to send”);
第一個(gè)參數(shù),是Unity的對(duì)象名字,注意,不是腳本名字喔!!!
第二個(gè)參數(shù),是掛載在Unity對(duì)象的某個(gè)腳本的方法名稱
第三個(gè)參數(shù),是方法的參數(shù)。
3.1 Android端
3.1.1 添加依賴
首先,要把UnityPlayer依賴進(jìn)來。在哪里呢?
在你的Unity安裝目錄下,Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
里面有個(gè)classes.jar,拿出來,放到Android工程,具體模塊的libs目錄下。
然后android gradle添加依賴:
dependencies {
compileOnly files('libs/classes.jar')
}
當(dāng)然了,你開心的話,也可以把jar改個(gè)名字。
注意,需要compileOnly而不是implementation,否則打包aar到Unity后,會(huì)把libs目錄也打包到aar,最后Unity編譯apk會(huì)失敗,因?yàn)橛兄貜?fù)的classes.jar。
3.1.2 代碼邏輯
private static String mGameObject = "";
private static String mCallbackFunction = "";
public static void checkPermission(Context context, String gameObject, String callbackFunction) {
Log.i(TAG, "checkPermission gameObject " + gameObject + " callbackFunction " + callbackFunction);
mGameObject = gameObject;
mCallbackFunction = callbackFunction;
//TODO 做實(shí)際處理,例如請(qǐng)求權(quán)限
}
//處理完事情,通過消息告訴Unity結(jié)果
private static void notifyResult(boolean permissionGranted) {
try {
//參數(shù)1, 腳本掛載的gameObject名稱,參數(shù)2, 腳本方法,參數(shù)3,返回值
Log.w(TAG, "notifyResult, permissionGranted " + permissionGranted + " mGameObject " + mGameObject + " mCallbackFunction " + mCallbackFunction);
UnityPlayer.UnitySendMessage(mGameObject, mCallbackFunction, permissionGranted ? "1" : "0");
getInstance().mContext = null;
} catch (Exception e) {
e.printStackTrace();
}
}
上面的checkPermission由Unity調(diào)用。notifyResult則是處理完事情,通過消息告訴Unity結(jié)果。
3.2 Unity端
首先是調(diào)用的方法:
private void checkPermission()
{
Debug.Log(TAG + "checkPermission");
AndroidJavaObject nativeObject = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.PermissionHelper");
nativeObject.CallStatic("checkPermission", activity, "AndroidVideoScreen", "onPermissionResult");//AndroiwdVideoScreen 為腳本掛載的對(duì)象,onPermissionResult為腳本監(jiān)聽回調(diào)的函數(shù)名稱
}
這里,把腳本所掛載的對(duì)象名字,即AndroidVideoScreen,傳遞給了Android。以及把腳本處理的回調(diào)函數(shù)名稱onPermissionResult,也告訴Android。
接著,就是實(shí)現(xiàn)onPermissionResult, 等著接收回調(diào)了:
public void onPermissionResult(String resultCode)
{
//TODO
}
總結(jié)
到此這篇關(guān)于Unity同步/異步調(diào)用Android的文章就介紹到這了,更多相關(guān)Unity同步異步調(diào)用Android內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android簡(jiǎn)易文件管理器實(shí)例(列表式文件目錄)
下面小編就為大家?guī)硪黄猘ndroid簡(jiǎn)易文件管理器實(shí)例(列表式文件目錄)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Android?Navigation重建Fragment問題分析及解決
這篇文章主要介紹了Android?Navigation重建Fragment問題分析及解決,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Android 微信小視頻錄制功能實(shí)現(xiàn)詳細(xì)介紹
這篇文章主要介紹了Android 微信小視頻錄制功能實(shí)現(xiàn)詳解的相關(guān)資料,這里提供了具體的實(shí)現(xiàn)思路及代碼,需要的朋友可以參考下2016-11-11
Android Studio3.6中的View Binding初探及用法區(qū)別
這篇文章主要介紹了Android 中的View Binding初探及用法區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android之PreferenceActivity應(yīng)用詳解(2)
看到很多書中都沒有對(duì)PreferenceActivity做介紹,而我正好又在項(xiàng)目中用到,所以就把自己的使用的在這總結(jié)一下,也方便日后查找2012-11-11
Android編程之PopupWindow隱藏及顯示方法示例(showAtLocation,showAsDropDown
這篇文章主要介紹了Android編程之PopupWindow隱藏及顯示方法,結(jié)合實(shí)例形式分析了showAtLocation及showAsDropDown方法實(shí)現(xiàn)PopupWindow控件隱藏及顯示功能相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果
本文將帶大家學(xué)習(xí)一下如何利用toast中的motion_toast組件實(shí)現(xiàn)一個(gè)流動(dòng)的漸變色邊框效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Android ChipGroup收起折疊效果實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Android ChipGroup收起折疊效果實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android中應(yīng)用前后臺(tái)切換監(jiān)聽的實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于Android中應(yīng)用前后臺(tái)切換監(jiān)聽實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07

