存储数据
用 Persistent 存储跨场景与存档保留的数据,包括创建、读写方法与允许的取值类型
需要跨场景保留并写入存档的数据使用 Persistent。story.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")} 枚硬币。`,
]);条件中可以使用 equals、isTrue、isFalse 和 evaluate
Condition.If(player.evaluate("coins", (coins) => coins >= 50), [
alice.say("你的硬币够了。"),
]);可存储字符串、数字、布尔值、普通对象、数组、null、undefined 和 Date。不要存储类实例、函数、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 存档系统