昼夜サイクル
時間がひとりでに進みます。3 ターンごとに朝、昼、夕方、夜と移り、また朝に戻ります。時間帯ごとに AI に渡す雰囲気と音楽が変わり、プレイヤーはいつでもいまの時間を確認できます。ビヘイビア、条件ロア、音楽のルールで作るので、コードは要りません。
これから作るもの
- 4 つの時間帯:Morning → Noon → Evening → Night → Morning
- 3 ターンごとに時間が進む:プレイヤーは何もしなくて大丈夫です
- 雰囲気が変わる:時間帯ごとに、光、気温、人々の様子を書いたロアエントリがあり、AI に届くのはいまの時間帯のものだけです
- 音楽が変わる:朝は鳥のさえずり、夜は虫の声。フェードで切り替わります
- 時間が画面に出る:プレイヤーにいまの時間帯が見えます
しくみ
3 ターン目が終わる
→ ビヘイビア「Morning → Noon」が発動(Nターンごと:3、次の場合のみ:Time of day が Morning)
→ Time of day を Noon にして、時間が進んだことを AI に伝える
→ ロアエントリ「Noon」(条件:Time of day が Noon)が AI に届くようになり、「Morning」は届かなくなる
→ Noon の音楽ルールが当てはまり、Noon の曲がフェードイン
→ プレイヤー画面の Time of day が Noon になる時間が進むときに変わるのは、変数ひとつだけです。ロアと音楽はそれぞれこの変数を見ているので、勝手についてきます。
ステップバイステップ
ステップ1:変数を作る
カードの下にある 追加できるもの で + 変数 を押します。
| 項目 | 値 |
|---|---|
| 名前 | Time of day |
| 型 | 文字 |
| 初期値 | Morning |
| ビヘイビアルール | いまの時間帯。Morning、Noon、Evening、Night のどれか。光、天気、人々の様子をこれに合わせて描写する。 |
AI での扱い を開き、AI アクセス を AI は読み取り専用 にします。時計を進めるのはビヘイビアで、AI は読むだけです。
プレイヤー画面に表示 を押すと、チャット画面に時間帯が表示されます。
新しいゲームは必ず 初期値 から始まるので、サイクルは毎回 Morning から始まります。リセット用のビヘイビアは要りません。
ステップ2:時間帯ごとのエントリを 4 つ書く
時間帯ごとにロアエントリを 1 つずつ追加します。次に、変数 Time of day を各エントリの上にドラッグし、できた線をクリックして条件を「Time of day = Morning」のように設定します(ほかの時間帯も同様)。エントリは条件ロアのブロックに移り、条件を満たしているあいだだけ AI に届くようになります。
Morning
[Time of day: Morning]
早朝。場面を描写するときは、次の雰囲気を取り入れること:
- 東からやわらかな光が差し、空気は澄んでひんやりしている
- 草や花びらの露が光を受けてきらめく
- 枝で小鳥がさえずり、遠くで雄鶏が鳴く
- 人々は起き出したばかりで、店が一軒ずつ開いていく
- 落ち着いていて、希望を感じる雰囲気Noon
[Time of day: Noon]
真昼。場面を描写するときは、次の雰囲気を取り入れること:
- 太陽が真上にあり、地面が白くまぶしい
- 空気がこもり、遠くの景色が陽炎でゆらぐ
- たいていの人は日陰で休んでいて、通りは朝より静か
- 酒場や食堂は一番のにぎわいで、料理の匂いが漂ってくる
- のんびりしていて、うだるような雰囲気Evening
[Time of day: Evening]
夕暮れ。場面を描写するときは、次の雰囲気を取り入れること:
- 沈む夕日が空をオレンジと紫に染め、雲のふちが金色に光る
- 建物や木から長い影が伸びる
- 鳥がねぐらへ帰り、屋根の上に炊事の煙が上がる
- 人々は仕事を終えて家路につき、子どもたちが通りで追いかけっこをしている
- あたたかく、少しもの寂しい雰囲気Night
[Time of day: Night]
深夜。場面を描写するときは、次の雰囲気を取り入れること:
- 自然の明かりは月と星だけで、何もかもが銀色に見える
- ほとんどの窓は暗く、ところどころでろうそくがまだ灯っている
- 涼しい風に乗って、虫やカエルの声が聞こえる
- 通りにはほとんど人がいない。松明を持った夜警が通り過ぎる
- 暗闇には何かが潜んでいるかもしれない。獣か、盗賊か、もっと悪いものか
- 静かで、気の抜けない雰囲気4 つが一度に AI に届くと、AI はどれに従えばいいかわかりません。条件を付けておけば、届くのはいまの時間帯のものだけになります。
ステップ3:時間を進めるビヘイビアを作る
サイクルの一段階ごとにビヘイビアを 1 つ作ります。追加できるもの で + ビヘイビア を押します。
Morning → Noon
| 部分 | 設定 |
|---|---|
| 発動するとき | Nターンごと:3 |
| 次の場合のみ | Time of day が Morning |
| 効果 | 変数を変更:Time of day を Noon に |
AIに伝える:時間が朝から昼に進んだ。次の描写で、その変化を自然に表すこと。 |
Noon → Evening、Evening → Night、Night → Morning
値の組み合わせを次の時間帯に変えて、同じように作ります。
| ビヘイビア | 次の場合のみ | 変数を変更 | AIに伝える |
|---|---|---|---|
| Noon → Evening | Time of day が Noon | Time of day を Evening に | 時間が昼から夕方に進んだ。 |
| Evening → Night | Time of day が Evening | Time of day を Night に | 時間が夕方から夜に進んだ。 |
| Night → Morning | Time of day が Night | Time of day を Morning に | 夜が明け、新しい一日が始まった。 |
4 つとも同じターン(3、6、9……)に発動しようとしますが、次の場合のみ に書いた時間帯がそれぞれ違います。エンジンは 4 つすべてを、どれかが動く前の時間で判定するので、毎回ちょうど 1 つだけが発動します。
AIに伝える は、AI に一行だけ伝えるもので、効くのは次の返信だけです。続けて効くのはロアエントリのほうで、この一行は移り変わりを自然に読ませるためのものです。
ステップ4(任意):時間帯ごとの音楽
オーディオ ページに BGM トラックを 4 つ追加します(カードにまだオーディオがなければ、追加できるもの で + オーディオ を押します)。Morning、Noon、Evening、Night の 4 つで、どれも ループ再生 をオン、フェードイン(秒) と フェードアウト(秒) は 2 秒にします。
次に BGM設定 → 条件付きBGM → 条件付きルールを追加 を、時間帯ごとに 1 回ずつ行います。
| 項目 | 値 |
|---|---|
| トリガー | 変数条件:Time of day が Morning |
| 再生 | Morning |
| フェードイン(秒) / フェードアウト(秒) | 3 / 3 |
| 前のBGMを停止 | オン |
時間帯が変わると、古いルールが当てはまらなくなり、新しいルールが自分の曲を流し始めます。片方がフェードアウトしながら、もう片方がフェードインします。ルールについて詳しくはオーディオデザインガイドを見てください。
ステップ5(任意):画面に時計を出す
ステップ1の プレイヤー画面に表示 だけで、チャット画面に時間帯は出ます。もっと雰囲気を出したいときは、プレイヤー画面を使います。
- 画面全体 にある 冒険HUD テンプレートは、現在地、日数と時間帯、ゲージ 2 本を表示します。日数と時間帯の変数は自前で追加されるので、それを消して文字をあなたの Time of day に向けるか、自分の変数の代わりにテンプレートの変数を使います
- または、会話のページに 文字 の部品を追加し、変数の値を挿入… で
{Time of day}を表示します。太陽と月の 画像 の部品も足し、それぞれ 表示するタイミング → 変数が条件を満たすとき を設定します(月なら Time of day と等しいNight)
ステップ6:プレイテスト
上部バーの プレイ を押します。
- 最初の 2 ターンは Morning です
- 3 ターン目のあと Noon になり、AI の次の返信に暑さや真上の太陽が出てきます
- さらに 3 ターンで Evening、もう 3 ターンで Night。音楽を追加していれば、そのたびに曲が変わります
- さらに 3 ターンで、また Morning に戻ります
プレイテストの右側の このターン で、どのビヘイビアが動いたか、AI がどのロアエントリを受け取ったかを確認できます。
うまくいかないときは:
| 症状 | よくある原因 | 直し方 |
|---|---|---|
| 時間がまったく進まない | ビヘイビアの 次の場合のみ の値が 初期値 と一致していない | 変数と条件の Morning を同じつづりにします |
| 一度に 2 つ先の時間帯まで進む | 2 つのビヘイビアの 次の場合のみ が同じ値になっている | ビヘイビアごとに違う時間帯を判定させます |
| 雰囲気が変わらない | エントリの条件が間違っているか、常に送るブロックに残っている | 各エントリの条件と AI に渡すタイミング を確認します |
| AI が自分で時間を変える | AI アクセス が AI が読み書き可能 のまま | AI は読み取り専用 にします |
| 2 曲が同時に鳴る | 前のBGMを停止 がオフ | 時間帯ごとのルールでオンにします |
バリエーション:時間帯ごとに長さを変える
Nターンごと の間隔はいつも同じです。昼を長く、夜を短くしたいとき(たとえば昼の各時間帯は 4 ターン、夜は 2 ターン)は、ターンを自分で数えます。
- 数値の変数 Turns this period を追加します。初期値は
0、AI アクセス は エンジン専用(AI に非表示) にします - ビヘイビアを追加します:毎ターン、効果は 変数を変更 で Turns this period に
1を足す - 時間を進める 4 つのビヘイビアの 発動するとき を、Turns this period の 変数がしきい値を越える に変えます。上回る の値は、Morning → Noon、Noon → Evening、Evening → Night では
3、Night → Morning では1です。それぞれの 次の場合のみ は Time of day のまま残します - 4 つそれぞれに 変数を変更 で Turns this period を
0にする効果を足し、新しい時間帯でカウントがやり直しになるようにします
ターンではなく現実の時間で進める
数秒ごと は、プレイヤーがゲームを開いているあいだ、時計に合わせて発動します。4 つのビヘイビアに 300 を入れると、プレイヤーが文字を打っていてもいなくても、プレイ時間 20 分で 1 日が過ぎます。
カスタムコードの方法:最後のメッセージに時間バッジを付ける
インターフェースを自分で書くなら、インターフェースのコードで変数を読みます。ここまでの設定はそのままで構いません。
パネル → フロントエンドコード → index.tsx を開き、デフォルトの return <Chat /> を置き換えます。
export default function MyWorld() {
const api = useYumina();
const timeOfDay = String(api.variables["Time of day"] || "Morning");
const timeConfig = {
"Morning": { icon: "☀️", color: "#fbbf24", bg: "rgba(251,191,36,0.15)" },
"Noon": { icon: "🌤️", color: "#f59e0b", bg: "rgba(245,158,11,0.15)" },
"Evening": { icon: "🌅", color: "#f97316", bg: "rgba(249,115,22,0.15)" },
"Night": { icon: "🌙", color: "#818cf8", bg: "rgba(129,140,248,0.15)" },
};
const current = timeConfig[timeOfDay] || timeConfig["Morning"];
const msgs = api.messages || [];
return (
<Chat renderBubble={(msg) => {
const isLastMsg = msg.messageIndex === msgs.length - 1;
return (
<div>
<div
style={{ color: "#e2e8f0", lineHeight: 1.7 }}
dangerouslySetInnerHTML={{ __html: msg.contentHtml }}
/>
{isLastMsg && (
<div style={{
display: "inline-flex",
alignItems: "center",
gap: "6px",
marginTop: "12px",
padding: "4px 12px",
background: current.bg,
border: `1px solid ${current.color}33`,
borderRadius: "999px",
fontSize: "13px",
color: current.color,
fontWeight: "600",
}}>
<span style={{ fontSize: "16px" }}>{current.icon}</span>
<span>{timeOfDay}</span>
</div>
)}
</div>
);
}} />
);
}コードの中身:
api.variables["Time of day"]で、変数を名前で読みますtimeConfigで、時間帯ごとのアイコンと色を決めていますisLastMsgがあるので、バッジは最後のメッセージにだけ付きます。このチェックを外すと、すべてのメッセージに時間が付きます
パネル → フロントエンドコード のファイル横の状態が、緑の OK になっていれば大丈夫です。
クイックリファレンス
| やりたいこと | やり方 |
|---|---|
| N ターンごとに何かする | 発動するとき:Nターンごと |
| 現実の時間で何かする | 発動するとき:数秒ごと |
| いまの値で分岐する | トリガーが同じで 次の場合のみ が違うビヘイビアを複数作る |
| 時間帯ごとの雰囲気を AI に渡す | 時間帯ごとにロアエントリを 1 つ作り、Time of day の条件を付ける |
| 時間帯で音楽を変える | 条件付きBGM、変数条件、前のBGMを停止 をオン |
| 時間が進んだことを AI に伝える | 効果:AIに伝える(次の返信だけ) |
| AI に時間を変えさせない | AI アクセス:AI は読み取り専用 |
| 時間を表示する | プレイヤー画面に表示、文字の部品、またはインターフェースのコード |
これはレシピ #9 です
同じ組み立て方(ビヘイビアが一定のリズムで動かす変数と、それについてくるロアと音楽)は、天気、季節、NPC の機嫌にも使えます。プレイヤー画面の 一日の行動 テンプレートを使うと、日数、時間帯、一日に数回の行動が追加されます。育成や経営のカードに向いています。
