ゲーム開発の備忘録

趣味のゲーム開発でのノウハウや、技術的に嵌ったポイントを忘れないように書き記しておくブログです。

libGDXでMobiVMを用いてiOS版アプリを開発する

はじめに

2018年11月に、RoboVMが開発終了し、iOS12が非対応となったため、libGDXのiOSバックエンドをIntel-MOEに変更しなければならなくなった旨について記事を書きました。
deep-verdure.hatenablog.com

Intel-MOEも大元のIntel側での開発が終了し、有志によるコミュニティ版のアップデートが続けられていましたが、そんな中、2020年10月31日のlibGDX ver 1.9.12で衝撃的な変更が加えられます。

・As announced in Status Report #1, the iOS MOE backend was removed in favour of the RoboVM one.

libGDXはIntel-MOEを非対応とし、RoboVMを優先するとのコメントがリリースノートに記載されています。

変更コストを鑑みて、Intel-MOEでのビルド時のみver 1.9.11のlibGDXコンポーネントを用いるような構成とし、今日まで凌いでいましたが、2022年10月中旬頃のXcodeの更新後、moe-binding内のコードがエラーを出力するようになり、とうとうビルドができなくなってしまいました。libGDXの声明通り、RoboVMに戻る時が来たのです。しかし、RoboVMは開発終了したはず……。一体どうすればよいのでしょうか?

実は、RoboVMからフォークされ、最新のiOSに対応したオープンソースのクロスコンパイラが登場していました。それがMobiVMです。(一部でZombie RoboVMと言われていたり……)
mobivm.github.io

libGDX ver 1.9.12以降で記述されているRoboVMは、実際にはこのMobiVMを指しています。
(実は、libGDXのプロダクトページと、MobiVMのプロダクトページはUIがそっくりです。libGDXがIntel-MOEを切り捨て、MobiVMを優先した理由が読み取れる気がします)

本記事では、MobiVMを用いたiOSアプリ開発と、それに付随するlibGDX ver 1.11.0に完全対応したDesktop版の開発における注意点を説明します。

MobiVMを用いたiOS版アプリの開発

MobiVMを採用するとなると、libGDXの最新バージョンを全面的に使用可能になります。ios-moeプロジェクトが存在していた頃のlibGDXと比較すると、トップレベルから各プロジェクトに至るまで、build.gradleを始めとした様々な資材の内容が大幅に変更されています。
そこでおすすめしたいのが、最新のgdx-setup.jarを用いてプロジェクトを作成し、そこに今まで利用していたandroidios、desktop、core内のソースファイルを持ってくることです。思い切って綺麗にしてしまいましょう。

MobiVMを利用したエミュレータによるアプリ実行およびIPAの生成は、かつてのRoboVMを用いた方法と変わりありません。(Intel-MOEを使用していた場合、思い出すのに苦労するかもしれませんが……)
一点注意するとすれば、MobiVMプラグインを導入したAndroid Studio for MacでRun/Debugの構成設定編集をする際に、「RoboVM iOS」を押下してから設定項目欄が表示されるまでの間に結構な時間がかかることです。この間にAndroid Studio for Macの別のところをクリックしたりしてしまうとフリーズします。
私は当初これに気付かず、MobiVMプラグインに問題があるのではと疑って無駄な調査時間を過ごしてしまいました……。「RoboVM iOS」を押下したらじっと待ちましょう。

libGDX ver 1.11.0自動生成プロジェクトにおけるDesktop版アプリのエントリポイントについて

libGDX ver 1.11.0において、Desktop版アプリのエントリポイントをKotlinで記述する場合は注意が必要です。
以前はmain関数のみ記述したファイルをAndroid Studio for Macの構成設定編集で指定して実行が可能でしたが、ver 1.11.0の自動生成プロジェクトにおいてはその方法が使用できなくなりました。
Gradleスクリプトからのエントリポイント起動のみ受け付けるため、Javaで記述されたエントリポイントと正しく同じものをKotlinで記述しなければなりません。以下を参考に記述してください。

object DesktopLauncher {
    @JvmStatic
    fun main(args: Array<String>) {
        val gameMainObject = GameMain() //Gameを継承した独自クラス
        val config = Lwjgl3ApplicationConfiguration()
        config.setTitle("title")
        config.setWindowIcon("img/desktop/icon.png")
        Lwjgl3Application(gameMainObject, config)
    }
}

なお、libGDX ver 1.11.0からは、LwjglApplicationではなくLwjgl3Applicationクラスを利用するようになっています。これはM1 Mac対応のために拡張されたLwjglApplicationクラスです。

ちなみに、LwjglApplicationクラスでは、widthフィールドとheightフィールドの値を設定することでウィンドウサイズを設定できていましたが、Lwjgl3Applicationクラスではその方法は使えなくなっています。
coreプロジェクト側でGdx.graphics.setWindowedMode()関数を呼び出して、ウィンドウサイズを設定しましょう。