NarraLeaf

環境設定を管理する

usePreference フックを使って、自動送り・スキップ・文字速度・音量などの再生に関する設定を読み書きする方法

環境設定は、自動送り、スキップの挙動、文字速度、音量など再生を制御します。GameProviders の下にレンダリングされる UI では usePreference() を使用します。

import { usePreference } from "narraleaf-react";

export function AutoForwardButton() {
    const [autoForward, setAutoForward] = usePreference("autoForward");

    return (
        <button onClick={() => setAutoForward(!autoForward)}>
            自動送り:{autoForward ? "オン" : "オフ"}
        </button>
    );
}

setter は新しい値を直接受け取ります。React の関数形式の更新は受け付けません。

文字速度と音量

function PreferencesPanel() {
    const [cps, setCps] = usePreference("cps");
    const [voiceVolume, setVoiceVolume] = usePreference("voiceVolume");

    return (
        <div>
            <label>
                文字速度
                <input
                    type="range"
                    min={1}
                    max={60}
                    value={cps}
                    onChange={(event) => setCps(Number(event.target.value))}
                />
            </label>
            <label>
                ボイス音量
                <input
                    type="range"
                    min={0}
                    max={1}
                    step={0.05}
                    value={voiceVolume}
                    onChange={(event) => setVoiceVolume(Number(event.target.value))}
                />
            </label>
        </div>
    );
}

利用できるキーには autoForwardskipshowDialoggameSpeedcpsvoiceVolumevoiceFadeDurationvoiceEndModebgmVolumesoundVolumeglobalVolumeskipDelayskipInterval があります。型とデフォルト値については GamePreference を参照してください。

環境設定を永続化する

環境設定は SavedGame とは別のものです。明示的にエクスポートして保存する必要があります。

import { useEffect } from "react";
import { useGame } from "narraleaf-react";

function PreferenceStorage() {
    const game = useGame();

    useEffect(() => {
        const raw = localStorage.getItem("game-preferences");
        if (raw) game.preference.importPreferences(JSON.parse(raw));

        const token = game.preference.onPreferenceChange(() => {
            localStorage.setItem(
                "game-preferences",
                JSON.stringify(game.preference.exportPreferences()),
            );
        });

        return token.cancel;
    }, [game]);

    return null;
}

このページの目次