WebエンジニアがJavaScriptだけでゲームを作れる時代
「自分はHTML/CSS/JavaScriptしか書けない。でもApp StoreやGoogle Playにゲームを出してみたい」――そう思ったことはありませんか?
少し前なら、モバイルゲーム開発といえばUnityでC#を書くか、Swift/Kotlinでネイティブ開発するかの二択でした。Webエンジニアにとってはどちらも「新しい言語とツールチェーンを丸ごと覚え直す」ことを意味し、かなり高いハードルだったはずです。
ところが2026年の今、状況は大きく変わっています。JavaScriptだけでゲームを作り、そのままApp StoreとGoogle Playに出すことが現実的な選択肢になりました。使うのは、2DゲームならPhaser.js、3DゲームならThree.js。そしてアプリ化のツールとしてCapacitorを組み合わせます。
この記事では、「ブラウザで動くゲームは作れるけど、アプリとして出す方法がわからない」というWebエンジニアに向けて、JSゲーム開発からストアリリースまでの全体像を解説します。
JSゲームの選択肢:Phaser(2D)とThree.js(3D)
JavaScriptでゲームを作るためのライブラリは数多くありますが、実績とコミュニティの厚さで選ぶならPhaser.jsとThree.jsの2つが鉄板です。
Phaser.js ― 2Dゲームの定番
Phaser.jsは、HTML5で2Dゲームを作るためのフレームワークです。スプライト管理、衝突判定、物理演算(Arcade Physics / Matter.js統合)、アニメーション、サウンド管理まで、2Dゲームに必要な機能がひと通り揃っています。
- タイルマップベースのRPG、プラットフォーマー、パズル、カードゲームなどに最適
- Canvas / WebGLどちらのレンダラにも対応しており、モバイルブラウザでも軽快に動作する
- ドキュメントとチュートリアルが豊富で、日本語情報も多い
- npmでインストールでき、TypeScriptにも対応
「ブラウザゲームを作ったことがある」という人の多くがPhaserを触った経験があるのではないでしょうか。2Dカジュアルゲームをアプリにしたいなら、最も堅実な選択肢です。
Three.js ― 3Dをブラウザに持ち込む
Three.jsはWebGLベースの3Dライブラリです。3Dモデルの表示、ライティング、カメラ制御、アニメーションなど、3Dシーンの構築に必要なAPIを提供しています。
- GLTFモデルの読み込みに対応しており、Blenderで作ったモデルをそのまま使える
- ローポリスタイルのカジュアル3Dゲームならモバイルでも十分実用的
- 物理演算が必要な場合はcannon-esやAmmo.jsなどを別途組み合わせる
- r3f(React Three Fiber)を使えばReact開発者にもなじみやすい
ただし、Three.jsはあくまで「3D描画ライブラリ」であって「ゲームエンジン」ではありません。シーン管理やゲームループ、UI、サウンド管理などは自分で実装するか、別のライブラリと組み合わせる必要があります。とはいえ、Webエンジニアにとってはその自由度こそが魅力でもあります。
どちらを選ぶか
| 項目 | Phaser.js(2D) | Three.js(3D) |
|---|---|---|
| 得意なジャンル | パズル、RPG、プラットフォーマー | ローポリ3D、レースゲーム、空間演出 |
| 学習コスト | 低い(ゲーム用APIが揃っている) | やや高い(3Dの概念理解が必要) |
| モバイル負荷 | 軽い | 最適化が必要 |
| 物理演算 | 内蔵(Arcade Physics) | 外部ライブラリが必要 |
迷ったら、まずはPhaserで2Dゲームを1本作ってアプリ化するのがおすすめです。成功体験を得てから、必要に応じてThree.jsに挑戦するのが効率的です。
CapacitorでブラウザゲームをAndroid/iOSアプリに変換する
ここからが本題です。ブラウザで動くJSゲームを、どうやってApp StoreやGoogle Playに出せるアプリに変換するのか。答えはCapacitorです。
Capacitorとは
CapacitorはIonic社が開発したオープンソースのランタイムです。Webアプリ(HTML/CSS/JavaScript)をiOS/Androidのネイティブアプリとしてパッケージングしてくれます。
仕組みはシンプルです。
- iOSではWKWebViewの中でWebアプリが動く
- AndroidではChromium WebViewの中でWebアプリが動く
- カメラ・GPS・プッシュ通知などのネイティブAPIには、JSブリッジ経由でアクセスできる
- 「Electronのモバイル版」だと思えばイメージしやすい
つまり、ブラウザで動くゲームはCapacitorでそのままアプリになるということです。コードの書き直しは基本的に不要です。
セットアップの流れ
既存のWebゲームプロジェクトにCapacitorを追加する手順は、驚くほどシンプルです。
# Capacitorをインストール
npm install @capacitor/core @capacitor/cli
# 初期化(プロジェクト名とパッケージIDを指定)
npx cap init "MyGame" "com.example.mygame"
# プラットフォームを追加
npm install @capacitor/android @capacitor/ios
npx cap add android
npx cap add ios
# Webアプリをビルドしてコピー
npm run build
npx cap sync
# Android Studioで開く
npx cap open android
これだけで、Android StudioやXcodeでビルド可能なネイティブプロジェクトが生成されます。あとはビルドしてAPK(またはIPA)を作るだけです。
Phaser公式もCapacitor統合を推奨
Phaserの公式サイトには、「Bring Your Phaser Game to iOS and Android with Capacitor」というチュートリアルが公開されています。また、Capacitorの公式ドキュメントにもゲーム向けガイドが存在します。つまり、「JSゲーム + Capacitorでアプリ化」は公式が想定しているユースケースなのです。
GitHubのCapacitorリポジトリのディスカッションでも「Three.js + GLTF + WebGLはCapacitor上で動くか?」という質問に対して、コミュニティから「動く。ただし最適化は必須」という回答が寄せられています。
パフォーマンスの現実:どんなゲームなら動くか
「ブラウザで動くならアプリでも動くでしょ?」――残念ながら、話はそう単純ではありません。CapacitorでアプリにしたときのパフォーマンスはPCブラウザとはかなり異なります。ここが最大の落とし穴です。
端末クラス別の挙動
AndroidのWebViewが使うGPUドライバは端末ごとにバラバラです。同じSnapdragonチップでも、メーカーのドライバ実装次第でWebGLの描画パフォーマンスが変わります。
| 端末クラス | 具体例 | Phaser(2D) | Three.js(3D) |
|---|---|---|---|
| ハイエンド | Pixel 8, Galaxy S24 | 60fps 問題なし | 60fps(最適化すれば) |
| ミドルレンジ | Pixel 7a, Galaxy A54 | 60fps 問題なし | 30fps以上(最適化必須) |
| ローエンド | RAM 3GB未満の廉価モデル | おおむね動作 | 厳しい |
ここで注目してほしいのは、Phaser(2D)はほとんどの端末で問題なく動くという点です。2Dゲームは描画負荷が圧倒的に軽いため、WebView経由でも十分なパフォーマンスが得られます。
Three.jsのボトルネック:draw call
Three.jsを使う場合、最も気をつけるべき指標はdraw call(GPUへの描画命令の回数)です。デスクトップブラウザでは1000以上のdraw callでもスムーズに動くシーンが、モバイルWebViewでは100を超えた時点でカクつき始めることがあります。
renderer.info.render.callsで現在のdraw call数を確認できます。
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
// 開発中はdraw callを常にモニタリング
console.log('Draw calls:', renderer.info.render.calls);
}
Three.jsで必須の最適化テクニック
モバイルでThree.jsゲームを動かす場合、以下の最適化は必須と考えてください。
1. ジオメトリ統合でdraw callを削減
同じマテリアルを使うオブジェクトはmergeGeometries()でまとめて、draw callを1回に集約します。
import { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js';
const geometries = meshes.map(m => m.geometry);
const merged = mergeGeometries(geometries);
const singleMesh = new THREE.Mesh(merged, sharedMaterial);
scene.add(singleMesh);
2. InstancedMeshで同一オブジェクトを効率描画
木、岩、敵キャラなど同じモデルを大量に配置する場合、InstancedMeshを使えばdraw callを1回に抑えられます。
const mesh = new THREE.InstancedMesh(geometry, material, count);
const matrix = new THREE.Matrix4();
for (let i = 0; i < count; i++) {
matrix.setPosition(Math.random() * 100, 0, Math.random() * 100);
mesh.setMatrixAt(i, matrix);
}
scene.add(mesh);
3. Draco圧縮でGLTFモデルを軽量化
Googleが開発したDraco圧縮により、GLTFモデルのファイルサイズを60〜90%削減できます。初回ロード時間の短縮とメモリ使用量の低減に直結します。
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('/draco/');
const gltfLoader = new GLTFLoader();
gltfLoader.setDRACOLoader(dracoLoader);
gltfLoader.load('model.glb', (gltf) => {
scene.add(gltf.scene);
});
4. テクスチャ圧縮(KTX2)
PNGやJPEGはCPUでデコードしてからGPUに転送されますが、KTX2形式のGPU圧縮テクスチャなら、GPUが直接読めるためメモリ使用量を1/4〜1/6に削減できます。
これら4つの最適化を組み合わせれば、draw call 100以下・テクスチャメモリ256MB以下という目標を達成でき、ミドルレンジ端末でも30fps以上を維持できる可能性が十分にあります。
App Store・Google Play審査の注意点
ゲームが動くようになったら、次はストアへの提出です。ここにもWebViewアプリならではの注意点があります。
Google Play:比較的通りやすい
Google PlayにはWebViewアプリに対する明示的な禁止規定がありません。クラッシュしない、応答性がある、基本的な品質基準を満たしている――これらをクリアしていれば、WebViewベースであっても審査に通ります。
Capacitor + JSゲームをAndroidに出す場合、Google Play側のハードルは低いと考えて問題ありません。
Apple App Store:ガイドライン4.2に要注意
問題はApple側です。Appleの審査ガイドラインには「4.2 Minimum Functionality」という項目があり、「Webサイトを単にラップしただけのアプリ」はリジェクトされる可能性があると明記されています。
ただし、ゲームの場合はWebサイトとは明確に異なるインタラクティブ体験を提供するため、単純なWebサイトラッパーとは見なされにくい傾向があります。それでも念のため、以下の対策を講じておくと安心です。
- プッシュ通知を実装する:Capacitorにはプッシュ通知プラグインがあり、実装コストは低い。これを1つ入れるだけで「アプリとして成立している」と判断されやすくなる
- オフライン動作に対応する:Service Workerでアセットをキャッシュし、ネット接続なしでもゲームが起動するようにする
- ネイティブAPIを1つ以上使う:ハプティクスフィードバック(振動)やGame Center連携など、ブラウザでは使えないAPIを活用する
特にプッシュ通知の実装は効果的です。「新しいステージが追加されました」「ランキングが更新されました」のような通知を送れるだけで、アプリとしての存在意義がレビューアに伝わりやすくなります。
その他のストア提出Tips
- APKサイズ:Capacitor + JSゲームなら5MB程度から始められる(Unityは空プロジェクトでも50MB超)
- スクリーンショット:ストアに掲載する画面写真は、ゲームのベストシーンをキャプチャする。WebView感が出ないよう、ステータスバーは非表示にする
- プライバシーポリシー:Google Play・App Storeともに必須。個人情報を収集しない場合でも「収集しない」旨を記載したページが必要
結論:「JSゲーム → Capacitorでアプリ化」は現実的か
ここまでの内容をまとめます。
現実的なパターン
| やりたいこと | 技術スタック | 現実度 |
|---|---|---|
| 2Dカジュアルゲームをアプリ化 | Phaser + Capacitor | 十分実用的。中低端末でも安定動作 |
| ローポリ3Dゲームをアプリ化 | Three.js + Capacitor | 最適化すれば現実的。draw call管理が鍵 |
| 本格的な3Dアクションゲーム | Capacitorでは厳しい | 素直にUnityやGodotを検討すべき |
最大のメリット:Web版とアプリ版を同じコードで出せる
Capacitorの最大の強みは、Web版とアプリ版でコードベースを共有できることです。itch.ioやGitHub Pagesでブラウザ版を無料公開しつつ、App Store/Google Playにもアプリ版を出す。同じゲームを2つのチャネルで展開できるのは、個人開発者にとって大きなアドバンテージです。
「JSしか書けない」はもう制約じゃない
かつて「モバイルゲームを出すにはC#かSwift/Kotlinが必要」と言われていた時代は終わりました。2026年の今、JavaScriptの知識だけで以下のことが可能です。
- Phaserで2Dゲームを作る
- Three.jsでローポリ3Dゲームを作る
- Capacitorでネイティブアプリにパッケージング
- 同じコードでWeb版も公開
- プッシュ通知やハプティクスなどのネイティブ機能も追加可能
もちろん、Unityのような本格エンジンに比べれば制約はあります。フォトリアルなグラフィクスや大規模なアクションゲームには向きません。しかし、カジュアルゲームを1本ストアに出してみたいというWebエンジニアにとって、Phaser/Three.js + Capacitorは最も現実的で、最もハードルの低い選択肢です。
ブラウザで動くゲームがすでにあるなら、Capacitorでアプリにするのは数時間の作業です。「アプリを出す」という体験を、ぜひJavaScriptで味わってみてください。
参考ソース
- Phaser公式 - Bring Your Phaser Game to iOS and Android with Capacitor
- Capacitor公式 - Games Guide
- GitHub - Capacitor Discussion: Three.js + GLTF + WebGL
- Three.js Best Practices 100 Tips
- MobiLoud - App Store Review Guidelines for WebView Wrapper Apps



コメント