NarraLeaf

存储数据

用 Persistent 存储跨场景与存档保留的数据,包括创建、读写方法与允许的取值类型

需要跨场景保留并写入存档的数据使用 Persistentstory.createPersistent() 会一次完成创建和注册

import { Story } from "narraleaf-react";

const story = new Story("my-story");

const player = story.createPersistent("player", {
    name: "Alex",
    coins: 0,
    hasKey: false,
    startedAt: new Date(),
});

如果手动创建 Persistent,必须在故事运行前注册

import { Persistent } from "narraleaf-react";

const player = new Persistent("player", { coins: 0 });
story.registerPersistent(player);

修改和显示数据

set()assign() 会创建剧情动作。get() 返回动态 Word,在台词显示时读取最新值

scene.action([
    player.set("coins", 50),
    player.set("coins", (coins) => coins + 10),
    player.assign({ hasKey: true }),
    alice.say`你有 ${player.get("coins")} 枚硬币。`,
]);

条件中可以使用 equalsisTrueisFalseevaluate

Condition.If(player.evaluate("coins", (coins) => coins >= 50), [
    alice.say("你的硬币够了。"),
]);

可存储字符串、数字、布尔值、普通对象、数组、nullundefinedDate。不要存储类实例、函数、DOM 节点或循环引用对象

保存当前游戏

serialize() 返回完整的 SavedGame 对象。应保存整个对象,而不是只保存 Persistent 命名空间

import { useLiveGame } from "narraleaf-react";

function SaveButton() {
    const liveGame = useLiveGame();

    function save() {
        const data = liveGame.serialize();
        localStorage.setItem("save-slot-1", JSON.stringify(data));
    }

    return <button onClick={save}>保存</button>;
}

读取存档

解析保存的对象并传给 deserialize()。读取后,当前运行状态会被替换

import type { SavedGame } from "narraleaf-react";

function load() {
    const raw = localStorage.getItem("save-slot-1");
    if (!raw) return;

    const data = JSON.parse(raw) as SavedGame;
    liveGame.deserialize(data);
}

生产环境中应把 localStorage 和网络数据视为不可信输入:校验结构,并捕获解析或版本兼容错误。完整例子见 localStorage 存档系统

本页目录