Unity で Android の Application クラスを使用する方法

Android で どうしても Application クラスを使用したい

Unity で Android アプリを作成していると、アプリ全体に関わる初期化や永続的な処理をしたい時に Application クラスがあると助かるケースもあると思います。

しかし、普通に Unity で Android アプリとして APK の書き出しやプロジェクトの Export するだけでは Application クラスはありません。なので、Unity プロジェクト内に Application クラスを配置して、Export 時にコピーしてあげることで Application クラスが使用できるか試してみました。

環境

- macOS Majave
- Unity 2018.3.10f1
- Android Studio 3.4.2

手順

1. Assets 配下に Pluginsフォルダを作成し、その配下に Android フォルダを作成

2. アプリケーション -> Unity -> Editor -> (バージョン名) -> PlaybackEngines -> AndroidPlayer -> Apk -> AndroidManifest.xml を 1. の Android フォルダ配下にコピー

3.1. Android フォルダに Application クラスを継承した任意の ○○Application.java を作成

3.2. 3.1 で作成した ○○Application クラス を 2. でコピーした AndroidManifest.xml に追記

<application 
    android:name=".○○Application">
    ...
</application>

4.  Assets 配下に Editor フォルダを作成し、○○PostProcess.cs を作成

5. ○○PostProcess.cs に以下追記

[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string outputProjectPath)
{
   if (buildTarget != BuildTarget.Android) return;
   // Applicationクラスを配置するパスの作成(適宜変更してください)
   var packageName = Application.identifier.Split('.');
   if (packageName.Length != 3)
   {
       return;
   }
   var projPath = $"{outputProjectPath}/{Application.productName}/src/main/java/{packageName[0]}/{packageName[1]}/{packageName[2]}";
   // Applicationクラスをコピー
   const string unityApplicationClassPath = "Assets/Plugins/Android/○○Application.java";
   CopyAndReplaceFile(unityApplicationClassPath, $"{projPath}/○○Application.java");
}
static void CopyAndReplaceFile (string srcPath, string dstPath)
{
    if (File.Exists(dstPath))
    {
        File.Delete(dstPath);
    }
    File.Copy (srcPath, dstPath);
}

6. Build Settings から Platform が Android になっていることを確認し、Export Project にチェックを入れ、Android プロジェクトとして書き出す

解説

実際に行なっていることは Unity から Android プロジェクトとして書き出す際に Applicaiton クラスを Android プロジェクトの方にコピーしているだけです。ただ、コピーしただけでは使用できないので AndroidManifest の方に使用する Application クラスを設定しています。(手順3.2)

なお、Unity からの Export でしか試していませんので、Unity からの直接 Build や Build And Run で動作するかはわかりません。

この記事が気に入ったらサポートをしてみませんか?