中級 25 min 19 / 20
ライブデモ
チュートリアル 19: 開発者ツール — Inspector、Input、Assets
レベル: 中級 時間: 25 分 学ぶこと: デバッグオーバーレイを取り付ける方法、キーボード / ゲームパッド入力を論理的アクションにマップする方法、プログレスイベント付きでアセットをプリロードする方法。
@joroya/inspector — デバッグオーバーレイ
npm install @joroya/inspector @joroya/core
import { Inspector } from "@joroya/inspector";
const inspector = new Inspector(scene, { position: "top-right" });
inspector.attach();
function frame(now: number) {
const dt = computeDt(now);
inspector.update(dt);
renderer.render(dt);
}
階層内の行をクリックしてノードを選択。下のパネルが transform 値と取り付けられたコンポーネントを表示。
DOM なしのメトリクスには FrameMetrics(ローリング FPS / avg / max-hitch)と collectSceneStats(scene) もエクスポート。
@joroya/input — アクションマッピング入力
npm install @joroya/input @joroya/core
import { InputManager } from "@joroya/input";
const input = new InputManager();
input.attach();
input.bindAction("jump", [{ key: "Space" }, { gamepad: "A" }]);
input.bindAction("move-forward", [{ key: "KeyW" }, { key: "ArrowUp" }]);
input.bindAction("fire", [{ mouseButton: 0 }, { gamepad: "RT" }]);
3 つのイベントタイプ
input.on("action-down", (e) => { /* 非アクティブ → アクティブの遷移 */ });
input.on("action", (e) => { /* ホールド中の連続 */ });
input.on("action-up", (e) => { /* リリース時 */ });
フレームごとのポール(ゲームパッドに必須)
function frame(dt) {
input.update(dt); // ゲームパッドを再ポール、ホールド中のアクションに `action` を発火
}
アナログ軸のダイレクトクエリ
const leftStickX = input.getGamepadAxis(0, 0); // -1..1
ブラーセーフ
ウィンドウがフォーカスを失うと、マネージャーはキーボード / マウス状態をクリア — キーが「貼り付き」ません。
@joroya/assets — プログレス付きプリローダー
npm install @joroya/assets @joroya/core
import { AssetManager } from "@joroya/assets";
const assets = new AssetManager();
assets.on("progress", (e) => progressBar.set(e.loaded / e.total));
await assets.preload([
{ url: "/tex/grass.png", type: "image" },
{ url: "/audio/loop.mp3", type: "audio" },
]);
const tex = assets.get<HTMLImageElement>("/tex/grass.png");
assets.release("/tex/grass.png");
- 重複排除: 同じ URL への同時
load()は 1 つの fetch を共有。 - 参照カウント:
load()インクリメント、release()デクリメント、0 で削除。 - 耐障害性: 個別エラーは全体の promise をリジェクトしない。
- プラグ可能:
registerLoader('gltf', myGltfLoader)でカスタムタイプ。
次のステップ
- 入力を物理に接続:
"throw"アクションをバインドしてapplyImpulse(...)を呼び出す。 - ローディング画面:
assets.on("progress")をリッスンしてloaded === totalでフェードアウトする HTML オーバーレイ。 - マルチゲームパッド:
getGamepadAxis(index, axis)はインデックスを受け取る — 2 人プレイヤーをindex: 0とindex: 1に。