ゲーム
Game クラスのプリファレンス、オーディオバス、キーマッププロパティ、プラグイン登録、設定、ライフサイクルイベント
Game はゲーム自体を表すメインクラスです。ゲームのすべての設定と LiveGame を保持します。
Game は、それを所有する GameProvider に属します。
provider が 1 つ構築すると、別の provider はそれぞれ別の game を持ちます。自分がいる場所の game には
useGame() フックで到達できます。
公開プロパティ
preference
Preference インスタンス
Preference<GamePreference>- 参照: GamePreference
game.preference.setPreference("autoForward", true);audioBuses
オーディオバスミキサーです。GameConfig.audioBuses で宣言されたツリーと、プレイヤーがそれに対して
行った操作を保持します。new Game(...) の後ならいつでも、オーディオコンテキストが解放される前、
プレイヤーがマウントされる前であっても利用できます。
AudioBusMixer- 参照: オーディオバス
game.audioBuses.setVolume("alice", 0.5);
localStorage.setItem("mixer", JSON.stringify(game.audioBuses.getVolumes()));keyMap
ゲームのキーバインド管理を行う KeyMap インスタンス
KeyMap- 参照: KeyMap
game.keyMap.setKeyBinding(KeyBindingType.skipAction, "Control");公開メソッド
getLiveGame
- 返り値:
LiveGame- LiveGame インスタンス
configure
ゲームに新しい設定を割り当てます。
注意: このメソッドはゲームが初期化される前に使うことを想定しています。
ゲームの初期化後に呼び出しても反映されないか、すぐには反映されません。 Preference の設定はすぐに反映されます。
const game = useGame();
useEffect(() => {
game.configure({
ratioUpdateInterval: 0, // update the player size immediately
/* cursor */
cursor: "cursor.jpeg",
cursorHeight: 60,
cursorWidth: 60,
});
}, []);use
ゲームにプラグインを登録します。
注意: 同じ名前を持つプラグインは登録されません。
名前は
namespaceとnameから構成することを推奨します。 例:"@Namespace/PluginName"、"@Author/PluginName"、"PluginName"
game.use({
... /** plugin register config */
});plugin: IGamePluginRegistry- プラグイン登録の設定。参照: Plugin
dispose
ゲームを破棄し、すべてのリソースを解放します。
注意: この操作は取り消せません。
game.dispose();configureAndFreeze
ゲームを設定し、特定のフィールドを凍結してそれ以上の変更を防ぎます。
警告: NarraLeaf エンジンまたはプラグイン環境を使わずにこのメソッドを使うことは推奨されません。
game.configureAndFreeze({
ratioUpdateInterval: 0,
cursor: "cursor.jpeg"
});config: DeepPartial<GameConfig>- 適用して凍結するゲーム設定
freeze
特定の設定フィールドを凍結し、それ以上の変更を防ぎます。
警告: NarraLeaf エンジンまたはプラグイン環境を使わずにこのメソッドを使うことは推奨されません。
game.freeze(["ratioUpdateInterval", "cursor"]);fields: (StringKeyOf<GameConfig>)[]- 凍結する設定フィールド名の配列
ライフサイクルイベント
ゲームの起動過程には、監視できる時点が 2 つあります。それぞれはゲームのライフサイクル内で最大 1 回だけ
発火し、すべてのリスナーは同じコンテキストオブジェクト {game, gameState, liveGame, storable, scene} を
受け取ります。scene は null になることがあります。
preloadComplete は 0.17.0 で発火位置が変わりました。 現在はゲームに入る前、つまりメニューが
まだ画面に表示されている可能性がある段階で発火します。newGame() がシーンをマウントした後ではありません。
読み込みステップの制御にはこれを使い、「ゲームの内容が画面上にある」ことには firstSceneReady を
使ってください。参照: プリロード。
onPreloadComplete
初回のプリロードパスが完了したことを監視します。0.17.0 以降、これはゲームに入る前に発火します。
const token = game.onPreloadComplete(({scene}) => {
setLoadingBarDone(true);
});
token.cancel();fc: (ctx: GameLifecycleEventContext) => void- 返り値: LiveGameEventToken
oncePreloadComplete
同上ですが、最初の呼び出し後に自動的に取り除かれます。
fc: (ctx: GameLifecycleEventContext) => void- 返り値: LiveGameEventToken
whenPreloadComplete
初回のプリロードパスが完了したときに resolve します。すでに完了していれば即座に resolve するため、 リスナーの登録が遅れる可能性がある場合に安全な形式です。
const {scene} = await game.whenPreloadComplete();- 返り値:
Promise<GameLifecycleEventContext>
isPreloadComplete
初回のプリロードパスが完了しているかどうかです。
- 返り値:
boolean
onFirstSceneReady
最初のシーンが完全に準備できたことを監視します。プリロードパスが終わり、最初のシーンコンポーネントが マウントされ、さらにブラウザがそれを描画するフレームを 1 回消化した状態です。これはゲームが視覚的に プレイヤーへ見せられる状態になったことを示す、最も直接的な信号です。
const token = game.onFirstSceneReady(() => hideLoadingOverlay());
token.cancel();fc: (ctx: GameLifecycleEventContext) => void- 返り値: LiveGameEventToken
onceFirstSceneReady
同上ですが、最初の呼び出し後に自動的に取り除かれます。
fc: (ctx: GameLifecycleEventContext) => void- 返り値: LiveGameEventToken
whenFirstSceneReady
最初のシーンが完全に準備できたときに resolve します。すでに準備できていれば即座に resolve します。
await game.whenFirstSceneReady();- 返り値:
Promise<GameLifecycleEventContext>
isFirstSceneReady
最初のシーンが完全に準備できているかどうかです。
- 返り値:
boolean