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!

推薦閱讀: