Unity同步/異步調用Android的方法實例
1 Unity如何使用Android插件
很簡單,把android的模塊,打包成aar或者jar,放到Assets/Plugin/Android即可!
2 同步方法如何調用
2.1 例子1
Android端
假設Android有一個方法
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>即表示,調用某個類的靜態方法,且返回值是String。如果返回值要Int或者bool啥的,對應修改即可,例如CallStatic< bool >。
2.2 例子2
Android端
Android有一個方法
public void start(Context context, int externalTextureId) { .... }
這個不是靜態的方法瞭,但需要傳遞context對象。
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端的方法名,以及參數。
3 異步方法如何調用
異步的話,可以這樣:
Unity發起調用,Android處理調用,並通過消息,通知給Unity。
具體而言。首先,Java是有辦法向C#發消息的:
UnityPlayer.UnitySendMessage
這個類的調用方式:
UnityPlayer.UnitySendMessage(“GameObjectName”, “MethodName”, “parameter to send”);
第一個參數,是Unity的對象名字,註意,不是腳本名字喔!!!
第二個參數,是掛載在Unity對象的某個腳本的方法名稱
第三個參數,是方法的參數。
3.1 Android端
3.1.1 添加依賴
首先,要把UnityPlayer依賴進來。在哪裡呢?
在你的Unity安裝目錄下,Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
裡面有個classes.jar,拿出來,放到Android工程,具體模塊的libs目錄下。
然後android gradle添加依賴:
dependencies { compileOnly files('libs/classes.jar') }
當然瞭,你開心的話,也可以把jar改個名字。
註意,需要compileOnly而不是implementation,否則打包aar到Unity後,會把libs目錄也打包到aar,最後Unity編譯apk會失敗,因為有重復的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 做實際處理,例如請求權限 } //處理完事情,通過消息告訴Unity結果 private static void notifyResult(boolean permissionGranted) { try { //參數1, 腳本掛載的gameObject名稱,參數2, 腳本方法,參數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調用。notifyResult則是處理完事情,通過消息告訴Unity結果。
3.2 Unity端
首先是調用的方法:
private void checkPermission() { Debug.Log(TAG + "checkPermission"); AndroidJavaObject nativeObject = new AndroidJavaObject("com.iqiyi.cutgreenvideosdk.PermissionHelper"); nativeObject.CallStatic("checkPermission", activity, "AndroidVideoScreen", "onPermissionResult");//AndroiwdVideoScreen 為腳本掛載的對象,onPermissionResult為腳本監聽回調的函數名稱 }
這裡,把腳本所掛載的對象名字,即AndroidVideoScreen,傳遞給瞭Android。以及把腳本處理的回調函數名稱onPermissionResult,也告訴Android。
接著,就是實現onPermissionResult, 等著接收回調瞭:
public void onPermissionResult(String resultCode) { //TODO }
總結
到此這篇關於Unity同步/異步調用Android的文章就介紹到這瞭,更多相關Unity同步異步調用Android內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- android studio集成unity導出工程的實現
- Android實現Unity3D下RTMP推送的示例
- 詳解Unity安卓共享紋理
- AndroidStudio接入Unity工程並實現相互跳轉的示例代碼
- 詳解Unity入門之GameObject