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 で動作するかはわかりません。
この記事が気に入ったらサポートをしてみませんか?