19
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityでGradleを使ったAndroidプラグイン開発

Last updated at Posted at 2017-03-06

本構成による恩恵

UnityとAndroidが密に連携している場合、Android Studioで効率良くプラグインを開発するのは難しくなる。
そこで、Android StudioでもUnityの実行環境の上で、デバッグ開発を行えるようにし、効率良くプラグインの開発を行えるように工夫した。

text8111-4.png

動作確認環境

  • Windows
  • Unity 5.5.1f1
  • Android Studio 2.2.3

サンプルプロジェクト

GitHub: UnityAndroidPluginSample

プロジェクト全体の構成

UnityAndroidPluginSample
  │
  └── UnityProject                  // Unityプロジェクト
  │   └── copy_unity_export.bat     // コピーバッチ(Sync Android Studioから実行される)
  │   └── exclude_unity_export.list // コピー除外リスト
  │   └── clean_unity_export.bat    // エクスポートデータの初期化バッチ(Sync Android Studioから実行される)
  │   └── Assets/Plugins/Android
  │       └── AndroidManifest.xml   // 拡張項目を追加するAndroidManifest
  │       └── androidplugin.aar     // プラグイン生成モジュールのビルド結果
  │
  └── AndroidPluginFactory          // Androidプラグイン開発プロジェクト
  │   └── androidplugin             // プラグイン生成モジュール
  │   └── app                       // Unityからエクスポートされたモジュール
  │
  └── UnityExport                   // Unityからエクスポートされた中間データ

開発環境の構築

  1. Androidプラグイン開発用に新規プロジェクトを作成する
    001.png
  • ベースとなるappモジュールを作成する
    中身は後の工程でUnityからエクスポートされる為、ここでは空のプロジェクトを選択する。
    002.png

  • AndroidPluginFactory/appの下は、build.gradleを残し、削除する
    image8758.png
    また、build.gradleをプラグイン開発に必要な内容に変更する。dependenciesandroidpluginモジュールを追加し、Android Studioで実行した際にプラグインと連携できるようにする。

    app/build.gradle
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            applicationId "com.example.androidpluginfactory"
            minSdkVersion 19
            targetSdkVersion 25
        }
    }
    
    dependencies {
        compile files('libs/unity-classes.jar')
    
        // ビルドタイプに応じて、ライブラリモジュールのビルドタイプを変える
        releaseCompile project(path: ':androidplugin', configuration: 'release')
        debugCompile project(path: ':androidplugin', configuration: 'debug')
    }
    
  • Unityからエクスポートしたデータを、Android Studioのappモジュールへコピーするバッチを作成

    copy_unity_export.bat
    @rem 古いデータを削除
    rd /s /q ..\AndroidPluginFactory\app\build
    rd /s /q ..\AndroidPluginFactory\app\libs
    rd /s /q ..\AndroidPluginFactory\app\src
    
    @rem Unityからエクスポートしたデータを、プラグイン開発プロジェクトへコピー
    echo A | xcopy /e /EXCLUDE:exclude_unity_export.list ..\UnityExport\UnityProject ..\AndroidPluginFactory\app\
    
    pause
    

    コピー不要なデータの除外リストを作成。

    exclude_unity_export.list
    .mdb
    build.gradle
    androidplugin.aar
    

    また、Unityからのエクスポートは上書き出力になる為、初期化するバッチも併せて作成する。

    clean_unity_export.bat
    rd /s /q ..\UnityExport
    
  • AndroidManifest.xmlPlugins/Android下に作成し、UnityのActivityを拡張する

    AndroidManifest.xml
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
      <application android:icon="@drawable/app_icon">
        <activity android:name="com.example.androidplugin.SampleActivity" android:label="@string/app_name">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
      </application>
    </manifest>
    
  • UnityプロジェクトにAndroid Studioと同期する為のエディタ拡張コードを作成

    DevelopmentTool.cs
    using System.Diagnostics;
    using System.Linq;
    using UnityEditor;
    
    public class DevelopmentTool
    {
        [MenuItem("Tools/Sync Android Studio")]
        public static void SyncAndroidStudio()
        {
            EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
            EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
    
            // エクスポートは上書き出力されてゴミが残ってしまう為、事前に古いエクスポートデータを初期化する
            RunBatch(@"{Application.dataPath}\..\clean_unity_export.bat");
    
            const BuildOptions options = BuildOptions.AcceptExternalModificationsToPlayer
                                    | BuildOptions.Development
                                    | BuildOptions.AllowDebugging;
    
            BuildPipeline.BuildPlayer(
                (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray(),
                "../UnityExport",
                BuildTarget.Android,
                options
            );
    
            // プラグイン開発プロジェクトへUnityからエクスポートしたデータをコピー
            RunBatch(@"{Application.dataPath}\..\copy_unity_export.bat");
        }
    
        private static void RunBatch(string path)
        {
            var process = new Process();
            var info = process.StartInfo;
            info.FileName = path;
            info.UseShellExecute = false;
            process.Start();
            process.WaitForExit();
            process.Close();
        }
    }
    
  • エディタ拡張により表示された「Sync Android Studio」を実行し、AndroidPluginFactory/app下にUnityの実行データをコピーする
    image8780.png

  • Android Studioに戻り、プラグイン開発用のモジュールを新規作成する
    image8802.png

    image8813.png

  • プラグイン開発用モジュールのbuild.gradleを編集する

    • ライブラリモジュールのデバッグビルドを有効化(BuildConfig.DEBUG等が有効化される)
    • dependenciesに、Unityからエクスポートされたライブラリの参照を追加
    • androidpluginモジュールをAAR化してUnityへ転送するスクリプトを追加
    adnroidplugin/build.gradle
    android {
        ~~~
    
        // ライブラリモジュールのデバッグビルドを有効化
        publishNonDefault true
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile files('../app/libs/unity-classes.jar')
    }
    
    android.libraryVariants.all { variant ->
        variant.outputs.each { output ->
            output.packageLibrary.exclude('libs/unity-classes.jar')
        }
    }
    
    def AAR_NAME='androidplugin.aar'
    task makeAndExportAar(type: Copy) {
        from('build/outputs/aar/')
        into('../../UnityProject/Assets/Plugins/Android/')
        include('androidplugin-release.aar')
        rename('androidplugin-release.aar', AAR_NAME)
    }
    makeAndExportAar.dependsOn(build)
    
  • UnityPlayerActivityを拡張する

    public class SampleActivity extends UnityPlayerActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 拡張に成功したら"Android拡張成功!"とToast表示
            Toast.makeText(this, R.string.complete_message, Toast.LENGTH_LONG).show();
        }
    }
    
  • 最後に、正常にビルドできることを確認する

    [ Android Studio側 ]
    1. appモジュールを実行
    2. Toastで「Android拡張成功!」の表示を確認する
    [ Unity側 ]
    1. Android Studioにおける右ペインGradleの、
      AndroidPluginFactory > :androidplugin > Tasks > other > makeAndExportAarを実行
      image8824.png
    2. Unityで「Build And Run」を実行
    3. Toastで「Android拡張成功!」の表示を確認する

運用時の注意点

  • ブランチ切り替えを行った場合は、Unityと同期が取れていない為、「Sync Android Studio」を行う
  • androidpluginモジュールを変更した場合は、makeAndExportAarを実行しAARを更新してからコミットする(あくまでもAndroid Studioは拡張機能を開発する為の補助的な位置づけなので、Unityでビルドした際に正常に動作することを意識する)
19
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?