AI の語り口を切り替える
AI の語り方を変えるボタンをいくつか用意します。ノーマル、コメディ、ホラー。プレイヤーがどれかを押すと、AI の次の返信はその文体で書かれます。文体の指示はロアエントリに書いておき、変数が指しているあいだだけ AI に届くようにするので、コードは要りません。
作るもの
- 3 つのモード:ノーマル、コメディ、ホラー
- ワンタップで切り替え:次の返信から新しい文体になり、会話はそのまま続きます
- いまのモードが見える:どのモードになっているか、プレイヤーにわかります
- きれいに戻せる:モードが変わった瞬間に、前の文体は AI に届かなくなります
しくみ
プレイヤーが「コメディ」を押す
→ ボタンが変数 Mode を "comedy" にする
→ ロアエントリ「コメディ文体」は Mode = comedy のあいだだけ AI に届くので、入る
→ ロアエントリ「ホラー文体」は Mode = horror のあいだだけ届くので、入らない
→ AI の次の返信はコメディの文体で書かれるそれぞれの文体は、条件の付いた普通のロアエントリです。条件が同時に成り立つのは 1 つだけなので、手でオフにしなければいけないものはありません。
手順
ステップ 1:変数を作る
カードの下にある 追加できるもの から + 変数 を押します。
| 項目 | 値 |
|---|---|
| 名前 | Mode |
| 型 | 文字 |
| 初期値 | normal |
AI での扱い を開き、AI アクセス を AI は読み取り専用 にします。モードを変えるのはプレイヤーのボタンで、AI はそれに従うだけです。エンジンがこれを守らせるので、ビヘイビアルールに「これには触らないこと」と書く必要はありません。
チャットにモードを表示したいときは、プレイヤー画面に表示 を押します。
ステップ 2:文体ごとにロアエントリを書く
ロアエントリを 2 つ追加します(キャラクターと世界 の右上の +、またはツールバーの 追加)。
エントリ:コメディ文体
[語りの文体:コメディ]
すべてをユーモアのある、コミカルな調子で語ること。次のことをしてよい:
- 大げさな比喩や、ばかばかしいたとえを使う
- ときどき第四の壁を破って、読者に向けてひとこと挟む
- NPC に、間の悪いせりふを言わせる
- 深刻な場面を軽い口調で描いて、落差を出す
物語は前に進め続けること。ユーモアは語りに混ぜるもので、語りの代わりにはしない。エントリ:ホラー文体
[語りの文体:ホラー]
すべてを暗く、落ち着かない雰囲気で語ること。次のようにする:
- 情景描写ではテンポを落とし、音、匂い、手ざわりにじっくり触れる
- 何かが物陰から見ていることをほのめかすが、決して姿は見せない
- 周りのものに違和感を持たせる:ひとりでに閉まる扉、おかしな方向へ動く影、半拍遅れる鏡の中の自分
- NPC には少しずれたせりふを言わせる。知るはずのないことを知っているかのように
- ときどきキャラクターの体の感覚を二人称で描く:首筋の毛が逆立つ、鼓動が速くなる
緊張は高め続けるが、段落ごとに怪物を出さないこと。いちばん恐ろしいものは正体不明のままにしておく。ノーマルモードにはエントリは要りません。どちらの文体エントリも入っていないときは、AI はキャラクターと世界のエントリに書いてあるとおりに語ります。
それぞれのエントリに条件を付ける
変数 Mode を「コメディ文体」のエントリの上にドラッグします。両者のあいだに線が引かれるので、それをクリックして、条件を Mode = comedy にします。「ホラー文体」にも同じように horror で条件を付けます。
エントリは 条件ロア のブロックに移り、条件が成り立っているあいだだけ送られるようになります(エントリを開いて、下の AI に渡すタイミング から設定することもできます)。
文体の指示をどこに置くか
エントリは、ほかのロアと一緒に AI のプロンプトに入ります。AI がつい元の語り口に戻ってしまうときは、エントリを開いて 注入先 を 最後に置く にします。その文は会話全体のあと、AI が返信する直前に置かれ、AI がいちばん注意を払う位置になります。
ステップ 3:ボタンを置く
上部バー中央の プレイヤー画面 を押します。会話のページに ボタン を 3 つ置き(部品を追加 → ボタン)、それぞれ「ノーマル」「コメディ」「ホラー」と名前を付けます。押したとき、順番に に、ボタンごとに次の手順を入れます。
- 変数を変える:Mode、にする、
normal/comedy/horror - 通知を表示:
コメディモードに切り替えました(ほかのモードもそれぞれ合わせて)
いまのモードを目立たせたいときは、ボタンを複製して、コピーの見た目を変えます。そして 表示するタイミング → 変数が条件を満たすとき で、Mode がその値のときだけ表示されるようにします。その上に普通の見た目のボタンを重ね、逆の条件(Mode がその値 と等しくない)を付けます。
編集 をオフにしてボタンを押してみましょう。このプレビューでは AI は呼ばれませんが、Mode が変わる様子は確認できます。
ビヘイビアで作る場合
切り替えのしくみをキャンバスに置いておきたいなら、モードごとにビヘイビアを 1 つ作ります。発動するとき:プレイヤーがボタンを押した、ボタン mode-comedy。効果:変数を変更 で Mode を comedy に、通知を表示 で コメディモードに切り替えました。こうすると、各ボタンの手順は ビヘイビアを動かす の 1 つだけで済みます。画面のコードからも、api.executeAction("mode-comedy") で同じビヘイビアを動かせます。
ステップ 4:プレイテスト
上部バーの プレイ を押します。
- ノーマルモードで 2〜3 ターン会話します
- コメディ を押します。通知が出て、Mode が comedy になります
- メッセージを送ります。返信がユーモラスになり、第四の壁を破ることもあります
- ホラー を押して、もう一度送ります。返信が暗く、張りつめた調子になります
- ノーマル を押して、もう 1 通送ります。語りがカード本来の文体に戻ります
プレイテストの右側にある このターン には AI が受け取ったロアエントリが並ぶので、文体エントリが 1 つだけ入っているか確認できます。
うまくいかないとき:
| 症状 | 考えられる原因 | 直し方 |
|---|---|---|
| ボタンを押しても何も起きない | ボタンに 変数を変える の手順がない | ボタンを選んで 押したとき、順番に を確認します |
| Mode は変わるのに文体が変わらない | エントリの条件が値と合っていない | ボタンが入れるのは comedy なので、条件もぴったり comedy にします |
| 2 つの文体が両方 AI に届く | 片方のエントリが、いつも送られるブロックに入っている | 両方のエントリで AI に渡すタイミング を確認します |
| 数ターンで文体が薄れていく | 文体の指示がプロンプトの最後から遠い位置にある | 注入先 を 最後に置く にします |
コードで作る場合:最後のメッセージの下にモードボタンを出す
画面を自分で書いているなら、ボタンも自分で描いて、同じ変数を変えます。ステップ 2 のロアエントリはそのままです。
パネル → フロントエンドコード で index.tsx を開き、デフォルトの return <Chat /> を置き換えます。
export default function MyWorld() {
const api = useYumina();
const currentMode = String(api.variables["Mode"] || "normal");
const msgs = api.messages || [];
const modes = [
{ id: "normal", label: "Normal", color: "#94a3b8", activeColor: "#e2e8f0",
activeBg: "rgba(148,163,184,0.2)", border: "#475569", activeBorder: "#94a3b8" },
{ id: "comedy", label: "Comedy", color: "#fbbf24", activeColor: "#fef3c7",
activeBg: "rgba(251,191,36,0.2)", border: "#a16207", activeBorder: "#fbbf24" },
{ id: "horror", label: "Horror", color: "#f87171", activeColor: "#fecaca",
activeBg: "rgba(248,113,113,0.2)", border: "#991b1b", activeBorder: "#f87171" },
];
const switchTo = (mode) => {
api.setVariable("Mode", mode.id);
api.showToast("Switched to " + mode.label + " mode", "info");
};
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: "flex", gap: "8px", marginTop: "16px", flexWrap: "wrap" }}>
{modes.map((mode) => {
const isActive = currentMode === mode.id;
return (
<button
key={mode.id}
onClick={() => { if (!isActive) switchTo(mode); }}
style={{
padding: "8px 16px",
background: isActive ? mode.activeBg : "transparent",
border: `2px solid ${isActive ? mode.activeBorder : mode.border}`,
borderRadius: "8px",
color: isActive ? mode.activeColor : mode.color,
fontSize: "13px",
fontWeight: isActive ? "700" : "500",
cursor: isActive ? "default" : "pointer",
opacity: isActive ? 1 : 0.7,
transition: "all 0.2s ease",
}}
>
{isActive ? "● " : ""}{mode.label}
</button>
);
})}
</div>
)}
</div>
);
}} />
);
}コードがしていること:
api.variables["Mode"]で、変数名を使って値を読みますapi.setVariable("Mode", mode.id)で書き込みます。条件付きのエントリは、AI の次の返信から新しい値に従いますapi.showToast(text, "info")で通知を出します(種類は"success"、"error"、"info"の 3 つ)- いまのモードのボタンには点が付いて強調され、もう一度押しても何も起きません
- 変数を直接変える代わりにビヘイビアを動かしたいときは、
api.executeAction("mode-comedy")を呼びます
パネル → フロントエンドコード のファイル名の横の表示が、緑の OK になっていれば大丈夫です。
コードを自分で書きたくないときは
キャンバス右上の AIアシスタント を押して、ほしいボタンを説明してください。
ほかのアイデア
モードを増やす
ロアエントリをもう 1 つ(たとえば「詩的な文体」)追加して条件を Mode = poetic にし、Mode を poetic にするボタンをもう 1 つ置きます。
1 ターンだけの変化
「このキャラクターはこの返事のあいだずっとしゃっくりしている」のように、1 回の返信だけで終わるものには、効果 AIに伝える のビヘイビアを使います。プレイヤーには見えないひとことを、次の返信のときだけ AI に渡せます。数ターン続けたいときは、数値の変数をカウントダウンに使います。ボタンでそれを 3 にし、毎ターン のビヘイビアで 1 ずつ減らし、ロアエントリの条件を「カウントダウンが 0 より大きい」にします。
言語の切り替え
同じしくみで返信の言語も切り替えられます。「日本語だけで返信すること」というエントリに条件 Language = ja を付け、ほかの言語も同じように用意します。
AI に自分でモードを変えさせる
AI アクセス を AI が読み書き可能 のままにして、モードをいつ変えるべきかをビヘイビアルールに書きます(「一行が地下墓地に入ったら horror に切り替える」)。すると AI が自分で Mode を変え、同じエントリがそれに従います。
早見表
| やりたいこと | やり方 |
|---|---|
| モードがオンのあいだ、AI の書き方を変える | 変数に条件を付けたロアエントリ(条件ロア) |
| ボタンでモードを切り替える | プレイヤー画面のボタン:変数を変える |
| AI にモードを変えさせない | AI アクセス:AI は読み取り専用 |
| 文体の指示を AI がいちばん聞く位置に置く | エントリで 注入先:最後に置く |
| 次の返信だけのヒント | ビヘイビアの効果:AIに伝える |
| いまのモードを目立たせる | ボタンを 2 種類用意し、それぞれ 表示するタイミング → 変数が条件を満たすとき |
| 画面のコードから切り替える | api.setVariable("Mode", "comedy") または api.executeAction("mode-comedy") |
これはレシピ #11 です
同じしくみ(変数と、条件が成り立つときだけ AI に届くロアエントリ)は、難易度、一人称と三人称の語りの切り替え、物語が進むにつれて気分が変わるキャラクターにも使えます。
