Unity同步/異步調(diào)用Android的方法實(shí)例
1 Unity如何使用Android插件
很簡單,把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)實(shí)現(xiàn)選擇時(shí)間功能
安卓開發(fā)過程中難免會(huì)碰到需要選擇日期時(shí)間的情況,當(dāng)然不可能讓用戶自己輸入日期時(shí)間,小編收集整理了一些資料,總結(jié)了一下如何實(shí)現(xiàn)android選擇時(shí)間的功能,方便后來者參考2016-08-08詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12Android自定義view實(shí)現(xiàn)多色進(jìn)度條GradientProgressView的繪制
我們常使用shape實(shí)現(xiàn)漸變色,但是shape的極限卻只有三色,如果有超過三種顏色的View的要求,那么我們就不得不去自定義View來實(shí)現(xiàn)這個(gè)需求,所以下面我們就來看看如何自定義view實(shí)現(xiàn)多色進(jìn)度條的繪制吧2023-08-08android實(shí)現(xiàn)短按電源鍵關(guān)機(jī)的實(shí)現(xiàn)代碼
這篇文章主要介紹了android實(shí)現(xiàn)短按電源鍵關(guān)機(jī)的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Android開發(fā)之拖動(dòng)條/滑動(dòng)條控件、星級(jí)評(píng)分控件功能的實(shí)例代碼
這篇文章主要介紹了Android開發(fā)之拖動(dòng)條/滑動(dòng)條控件、星級(jí)評(píng)分控件功能的實(shí)例代碼,需要的朋友可以參考下2019-05-05談?wù)凙ndroid里的Context的使用實(shí)例
這篇文章主要介紹了談?wù)凙ndroid里的Context的使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11如果你在Android Studio碰到gradle的各種問題就來看這篇文章吧(強(qiáng)烈建議收藏)
這篇文章主要介紹了你可能會(huì)在Android Studio碰到gradle的各種問題,完美解決關(guān)于gradle的全部問題,切記收藏以防需要的時(shí)候找不到了哦2021-08-08