溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Unity同步/異步如何調(diào)用Android的方法

發(fā)布時間:2021-08-30 09:22:06 來源:億速云 閱讀:176 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Unity同步/異步如何調(diào)用Android的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    1 Unity如何使用Android插件

    很簡單,把android的模塊,打包成aar或者jar,放到Assets/Plugin/Android即可!

    2 同步方法如何調(diào)用

    2.1 例子1

    Android端

    假設(shè)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>即表示,調(diào)用某個類的靜態(tài)方法,且返回值是String。如果返回值要Int或者bool啥的,對應(yīng)修改即可,例如CallStatic< bool >。

    2.2 例子2

    Android端

    Android有一個方法

    public void start(Context context, int externalTextureId) {
    ....
    }

    這個不是靜態(tài)的方法了,但需要傳遞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端的方法名,以及參數(shù)。

    3 異步方法如何調(diào)用

    異步的話,可以這樣:

    Unity發(fā)起調(diào)用,Android處理調(diào)用,并通過消息,通知給Unity。

    具體而言。首先,Java是有辦法向C#發(fā)消息的:

    UnityPlayer.UnitySendMessage

    這個類的調(diào)用方式:

    UnityPlayer.UnitySendMessage(“GameObjectName”, “MethodName”, “parameter to send”);

    第一個參數(shù),是Unity的對象名字,注意,不是腳本名字喔!!!

    第二個參數(shù),是掛載在Unity對象的某個腳本的方法名稱

    第三個參數(shù),是方法的參數(shù)。

    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')
    }

    當(dāng)然了,你開心的話,也可以把jar改個名字。

    注意,需要compileOnly而不是implementation,否則打包aar到Unity后,會把libs目錄也打包到aar,最后Unity編譯apk會失敗,因為有重復(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 做實際處理,例如請求權(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 為腳本掛載的對象,onPermissionResult為腳本監(jiān)聽回調(diào)的函數(shù)名稱 
        }

    這里,把腳本所掛載的對象名字,即AndroidVideoScreen,傳遞給了Android。以及把腳本處理的回調(diào)函數(shù)名稱onPermissionResult,也告訴Android。

    接著,就是實現(xiàn)onPermissionResult, 等著接收回調(diào)了:

    public void onPermissionResult(String resultCode)
        {
           //TODO
        }

    以上是“Unity同步/異步如何調(diào)用Android的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI