【ITニュース解説】Two 3D games in two hours, and our boat game on Fire TV: life after Shipaton with Kotlin Multiplatform
2026年10月06日に「Dev.to」が公開したITニュース「Two 3D games in two hours, and our boat game on Fire TV: life after Shipaton with Kotlin Multiplatform」について初心者にもわかりやすく解説しています。
ITニュース概要
Kotlin Multiplatform (KMP) で開発されたゲーム「BoatBrawl」とそのライブラリ「Joyframe」を紹介。Joyframeは、AI活用で短時間で3Dゲームをマルチプラットフォームで作成可能だ。また、BoatBrawlのAmazon Fire TV対応では、低スペック環境向けにレンダリングやAI、入力処理を最適化した。KMPでのゲーム開発の可能性を示す。
ITニュース解説
この記事では、Kotlin Multiplatform(KMP)とCompose Multiplatform(CMP)という技術を使って作られた「BoatBrawl」というゲーム、そしてその開発過程で生まれたオープンソースライブラリ「Joyframe」について解説している。KMPは一つのコードベースからiPhone、Android、Mac、Windows、Webといった複数のプラットフォーム向けにアプリケーションを開発できる技術であり、CMPはユーザーインターフェース(UI)を統一的に記述するためのフレームワークである。BoatBrawlはこのKMPとCMPを活用し、様々なデバイスで動作するボートコンバットゲームとして制作された。
BoatBrawlの開発チームは、ゲーム制作の「難しい部分」を切り出し、「Joyframe」というライブラリとして公開した。Joyframeの目的は、他の開発者が簡単に3Dゲームを作れるようにすることだった。このライブラリが単にBoatBrawl専用のものではなく、汎用的なツールであることを証明するため、チームの一員であるAshwin氏がJoyframeを使ってわずか1時間で2つの全く新しい3Dゲームを開発するという実験を行った。
最初のゲームは「Island Panic」という、最大6人で遊べるパーティーゲームである。プレイヤーは芝生でできた浮島に立ち、お互いを押し合って海に落とす。時間と共に島は崩れていくため、最後まで残ったプレイヤーが勝者となる。このゲームの面白い点は、プレイヤーが何もインストールする必要がないことだ。ゲーム画面に表示されるQRコードをスマートフォンでスキャンするだけで、スマートフォンがゲームコントローラーとして機能する。画面には仮想のジョイスティックやプッシュボタン、現在の状況が表示され、ゲームのヒット時には振動も伝わる仕組みである。
Island Panicの開発は、ゲームエンジンや外部のアート、オーディオファイルを一切使わずに行われた点が特筆される。ゲーム内のモデル、キャラクターのアニメーション、草や水といった視覚要素はすべてKotlinのコードによって生成された。例えば、キャラクターは身体、頭、手足といった部品をコードで組み合わせて作られ、走ったり、押したり、落ちたりする動きもすべてコードで制御されている。さらに、効果音やBGMも数学的な計算によってリアルタイムで合成される。押し出す音はホワイトノイズを加工して作られ、ヒット音は特定の周波数から低い周波数へ変化するサイン波、水しぶきの音はノイズと「ブクブク」という音を組み合わせたものである。スマートフォンのコントローラー機能も、ゲーム自体がローカルのWi-Fiネットワーク上でKtorというWebサーバーを立ち上げ、スマートフォンと小さなJSON形式のメッセージをやり取りすることで実現している。QRコードのエンコーダーですら、既存ライブラリがAndroidに対応しないという理由から、Claude CodeというAIアシスタントを活用して280行のKotlinコードで自作されたという。
JoyframeがIsland Panicに与えた恩恵は大きい。3Dのゲーム画面は、Compose Multiplatformの通常のUI要素と同じように扱えるため、UIレイアウトやオーバーレイ表示が簡単に実現できた。MacではオフスクリーンでレンダリングされComposeに合成され、Androidでは専用のレンダースレッドで動作し、実機で測定された最適な描画設定(例えば、0.8倍のレンダリングスケールや60Hz固定など)がデフォルトで適用されるため、開発者は細かな最適化を意識することなく、高いパフォーマンスを得られた。また、ゲームのシーンはシンプルなデータ構造で表現されるため、ゲームのシミュレーションとレンダリングが明確に分離され、バグが発生しにくい構造となっている。シェーダーコードを一切書くことなく、ライティング、影、霧、水といった要素がJoyframeに組み込まれているため、3D表現を容易に実現できた。さらに、Joyframeのオフスクリーンレンダラー機能は、ゲーム画面をウィンドウを開かずに画像ファイルとして出力できるため、AIアシスタントがゲームの動作や見た目を確認し、バグを修正する際に非常に役立った。
パフォーマンス最適化の一例として、Island Panicの描画呼び出し回数削減がある。最初のバージョンでは、草の束、花、ヤシの葉、岩といった個々のオブジェクトをそれぞれ別々に描画していたため、描画呼び出し回数が1039回にも上っていた。これは高性能なPCでは問題ないが、Fire TV Stickのような低スペックデバイスでは処理負荷が非常に高くなる。そこで、ゲーム内のすべての色が16x16ピクセルのパレットテクスチャにまとめられ、各タイルとその上に乗る植物や岩などが一つのメッシュに結合された。これにより、一つの三角形がパレットテクスチャ内の特定の1ピクセルを参照するようにテクスチャ座標が設定され、描画呼び出し回数を65回まで大幅に削減できた。
2番目に開発されたゲーム「SkyFall」は、砂漠の渓谷をスカイダイビングするレースゲームで、Island Panicとはジャンルも見た目も大きく異なる。しかし、こちらもJoyframeを使うことで約1時間という短時間で完成した。この短時間開発が可能になった背景には、Joyframeの設計思想がある。すべてのコードがプレーンなKotlinで書かれているため、AIが容易にコードを読み書きできる。また、Joyframeのデフォルト設定が実機でのパフォーマンスを考慮して最適化されているため、開発者が誤って低速なゲームを作ってしまうリスクが低い。そして、オフスクリーンレンダリング機能により、AIが視覚的な出力を確認しながら開発を進められる点が大きい。これにより、Joyframeはゲームのルール、ボットのAI、スコアリング、UI、アート、オーディオ、コントローラーといったゲーム部分の開発に集中できる環境を提供し、マルチプラットフォームでの3Dシーンの描画という、通常は数週間かかるような難しい部分を肩代わりしてくれた。
一方、BoatBrawlはAmazon Fire TV Stickという新しいプラットフォームにも対応した。Fire TV Stickはスマートフォンよりも処理能力が低く、より高解像度のテレビに表示する必要があるため、特別な最適化が必要だった。BoatBrawlはFire TV Stickを検出し、専用の低電力プロファイルに切り替えるように設計されている。このプロファイルでは、フレームレートを60fpsではなく30fpsに固定し、3Dシーンの描画解像度を960x540に制限して、残りの拡大処理はテレビのスケーラーに任せる。影や高品質な水の表現をオフにし、水しぶきや砂といった装飾的な要素を削除する。さらに、ゲームのシミュレーション処理をUIスレッドとは別のワーカースレッドに移動させ、HUDの再描画頻度を毎フレームから1秒間に10回に減らすといった工夫が施されている。ボットの思考処理も簡素化され、フレームごとのメモリ割り当てを停止することで、ガベージコレクションによる処理の遅延を防いでいる。
また、Fire TV Stickのリモコン操作にも独自の対応が必要だった。Androidの一般的なゲームパッド判定では、Fire TVのリモコンもゲームパッドとして認識されてしまい、リモコンでゲームを操作できてしまう問題があった。これを解決するため、より厳密な判定を導入し、リモコンをゲームパッドとは異なるものとして扱った。リモコンはメニューのナビゲーションとゲームの一時停止(ポーズ)にのみ使用され、ゲームプレイ中に誤って操作されることがないように設計された。Bluetoothコントローラーは通常通りゲームパッドとして機能する。
Joyframeは今回の開発経験から得られたフィードバックを元に、さらに進化を続ける予定である。具体的には、Fire TVのような低電力デバイス向けのプロファイルを簡単に適用できる機能、描画呼び出しを削減するためのバッチ処理やインスタンス化のサポート、あらゆるスケールに対応するライティング、スマートフォンをコントローラーとして利用する機能のライブラリへの組み込みなどが挙げられている。
KMPとCMP、そしてJoyframeの組み合わせは、Kotlinを使ってマルチプラットフォームで効率的に3Dゲームを開発する可能性を大きく広げている。これらの技術は、システムエンジニアを目指す初心者にとっても、一つの言語とツールセットで多様なプラットフォームに対応できる現代的なソフトウェア開発の強力なアプローチを示している。