Android Studio は、Unity が呼び出すための aar パッケージをエクスポートします (Unity、AS 混合開発)

プロテスト Unity 2018.3.10 Unity2019.4.8 AndroidStudio4.0.1 が利用可能になりました

ソリューションの利点

  • Unity で class.jar を参照する必要はありません
  • AndroidManifest.xml ファイルを Unity の /Plugins/Android に配置する必要はありません
  • Unity のパッケージ化時に PackageName は参照ファイルに依存しません
  • 公開は簡単です。arr をエクスポートして /Plugins/Android ディレクトリに直接コピーするだけで、ファイルを変更せずに使用できます。

記事DEMOに対応するIDEのバージョン

  • AndroidStudio 3.0 (2.1 プロテスト合格)
  • Unity 2017.2 (5.4.3 プロテストに合格)

プロセス

アンドロイド部分

AndroidStudio プロジェクトを作成する

  1. まず、AndroidStudioを開いて新しいプロジェクトを作成しますが、このプロジェクトは後で使用しないので、ここにプロジェクト名とパッケージ名を入力するだけです。
  2. 最も低い SDK を選択できます。
  3. アクティビティでは、EmptyActivity を選択できます。
    ここに画像の説明を挿入
    次に、「完了」をクリックして AndroidStudio プロジェクトの作成を完了します。

Unity と対話する Module プロジェクトを作成する

1. プロジェクトの作成後にメインコースを開始し、アプリを選択して新しいモジュールを作成します。
ここに画像の説明を挿入
2. タイプとして「Android ライブラリ」を選択します
ここに画像の説明を挿入
。 3. アプリケーション/ライブラリ名を慎重に入力し、arr によってエクスポートされた名前を使用します。ここではそれを「MyUnityLib」と呼びます。

4. モジュール名が強迫性障害ではない場合は、心配する必要はありません

5. パッケージ名は後で Unity で使用しますが、unity でエクスポートしたパッケージ名とは関係ありませんので、ここでは「com.jing.unity」とします。


ここに画像の説明を挿入
6. 最小の SDK は、Unity がリリースするバージョンを超えないよう、できるだけ低いものを選択できます。

8. 次に、Unity と Android 通信のコア クラスとして com.jing.unity パッケージの下にクラスを作成します。名前はできるだけクールな名前にする必要があります。ここでは「Unity2Android」とします。
ここに画像の説明を挿入

Android コードを書く

9. 次に、このクラスのコードを直接貼り付け、コメントを直接参照して説明します。ここでは、Java のリフレクション原理を使用して、class.jar クラスをインポートすることによってのみ参照できる com.unity3d.player.UnityPlayer パッケージの下の currentActivity コンテキストを取得します。同様に、Unity にメッセージを送信することも反映の原則です。「getActivity」と「callUnity」の 2 つのメソッドは、ある程度の開発経験があれば簡単に理解できるはずです。
ここではシンプルなインターフェース「showToast」を実装します。

     package com.jing.unity;
     
     import android.app.Activity;
     import android.widget.Toast;
     
     import java.lang.reflect.InvocationTargetException;
     import java.lang.reflect.Method;
     
     /**
      * Created by Jing on 2018-1-18.
      */
     public class Unity2Android {
    
    
     
         /**
          * unity项目启动时的的上下文
          */
         private Activity _unityActivity;
         /**
          * 获取unity项目的上下文
          * @return
          */
         Activity getActivity(){
    
    
             if(null == _unityActivity) {
    
    
                 try {
    
    
                     Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                     Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                     _unityActivity = activity;
                 } catch (ClassNotFoundException e) {
    
    
     
                 } catch (IllegalAccessException e) {
    
    
     
                 } catch (NoSuchFieldException e) {
    
    
     
                 }
             }
             return _unityActivity;
         }
     
         /**
          * 调用Unity的方法
          * @param gameObjectName    调用的GameObject的名称
          * @param functionName      方法名
          * @param args              参数
          * @return                  调用是否成功
          */
         boolean callUnity(String gameObjectName, String functionName, String args){
    
    
             try {
    
    
                 Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                 Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
                 method.invoke(classtype,gameObjectName,functionName,args);
                 return true;
             } catch (ClassNotFoundException e) {
    
    
     
             } catch (NoSuchMethodException e) {
    
    
     
             } catch (IllegalAccessException e) {
    
    
     
             } catch (InvocationTargetException e) {
    
    
     
             }
             return false;
         }
     
         /**
          * Toast显示unity发送过来的内容
          * @param content           消息的内容
          * @return                  调用是否成功
          */
         public boolean showToast(String content){
    
    
             Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
             //这里是主动调用Unity中的方法,该方法之后unity部分会讲到
             callUnity("Main Camera","FromAndroid", "hello unity i'm android");
             return true;
         }
     }

Unity で使用できるように arr をエクスポートします

  1. コードを記述した後、モジュールを選択し、「ビルド」「プロジェクトの再構築」を選択します。

ここに画像の説明を挿入
11. 次に、Unity にインポートするファイルである arr ファイルを見つけます。(プロジェクトビューのビルドディレクトリにある必要があります)

ユニティ部分

  1. Unityプロジェクトを作成する

  2. Assets/Plugins/Android ディレクトリを作成し、このフォルダーの下にエクスポートしたばかりの arr ファイルを配置すると、インポートが完了します。そうです、とても簡単です。それでは、それを呼び出す方法を見てみましょう。
    ここに画像の説明を挿入

  3. インターフェイスにボタンを配置し、「Main Camera」にバインドされたスクリプトを作成します。テキスト コントロールを使用して、Android から送信されたメッセージを表示します。

  4. スクリプトコードの内容は以下の通りです

using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour {
    
    

    /// <summary>
    /// 场景上的文本框用来显示android发送过来的内容
    /// </summary>
    public Text text;

    /// <summary>
    /// android原生代码对象
    /// </summary>
    AndroidJavaObject _ajc;

    void Start () {
    
    
        //通过该API来实例化导入的arr中对应的类
        _ajc = new AndroidJavaObject("com.jing.unity.Unity2Android");
    }
    
    void Update () {
    
    
        
    }

    /// <summary>
    /// 场景上按点击时触发该方法
    /// </summary>
    public void OnBtnClick()
    {
    
    
        //通过API来调用原生代码的方法
        bool success = _ajc.Call<bool>("showToast","this is unity");
        if(true == success)
        {
    
    
            //请求成功
        }
    }

    /// <summary>
    /// 原生层通过该方法传回信息
    /// </summary>
    /// <param name="content"></param>
    public void FromAndroid(string content)
    {
    
    
        text.text = content;
    }
}
  1. 次に、テストのために APK を Android デバイスにパッケージ化します。
    ここに画像の説明を挿入
  2. ボタンをクリックして効果を確認してくださいここに画像の説明を挿入

デモアドレス

GitHub:https://github.com/jinglikeblue/unity_with_android

結論

  • aar と jar の違いは、Baidu で理解できます。
  • サードパーティのライブラリに接続したい場合は、Unity が使用できるように、modle およびパッケージ aar の下に接続できます。パッケージ化するときに一緒にエクスポートできるように、jar は aar のライブラリの下で参照される必要があることに注意してください。Gradle ネットワーク経由のダウンロードとコンパイルは、aar にパッケージ化されません。Gradle ネットワークからダウンロードされたファイルの jar は、Baidu で見つけることができます。

フォローアップ記事

この記事を書いた後、このソリューションは誰もが認識し、多くの偉人がこのソリューションを使用しても問題ないとコメントしました。ただし、ネイティブ アクティビティの一部のコールバックを書き直す必要がある場合、または一部の SDK でカスタム アクティビティを開発する必要がある場合はどうすればよいかという疑問も多く寄せられています。実際、実装は比較的簡単なので、要約した経験を共有するために続編を書きました。これにより、面倒な操作手順が削減され、ニーズをすぐに認識できるようにできるだけ簡単になります。

Unity と Android の相互作用スキームの最適化バージョンの継続: カスタム アクティビティの使用

著者:Pieces_Jing
リンク:https ://www.jianshu.com/p/6e7f580a7e8c
出典:Jianshu
著作権は著者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。

おすすめ

転載: blog.csdn.net/qq_40028144/article/details/108210548