v
Skip to content

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 つ置き(部品を追加 → ボタン)、それぞれ「ノーマル」「コメディ」「ホラー」と名前を付けます。押したとき、順番に に、ボタンごとに次の手順を入れます。

  1. 変数を変える:Mode、にする、normal / comedy / horror
  2. 通知を表示:コメディモードに切り替えました(ほかのモードもそれぞれ合わせて)

いまのモードを目立たせたいときは、ボタンを複製して、コピーの見た目を変えます。そして 表示するタイミング → 変数が条件を満たすとき で、Mode がその値のときだけ表示されるようにします。その上に普通の見た目のボタンを重ね、逆の条件(Mode がその値 と等しくない)を付けます。

編集 をオフにしてボタンを押してみましょう。このプレビューでは AI は呼ばれませんが、Mode が変わる様子は確認できます。

ビヘイビアで作る場合

切り替えのしくみをキャンバスに置いておきたいなら、モードごとにビヘイビアを 1 つ作ります。発動するとき:プレイヤーがボタンを押した、ボタン mode-comedy。効果:変数を変更 で Mode を comedy に、通知を表示 で コメディモードに切り替えました。こうすると、各ボタンの手順は ビヘイビアを動かす の 1 つだけで済みます。画面のコードからも、api.executeAction("mode-comedy") で同じビヘイビアを動かせます。


ステップ 4:プレイテスト ​

上部バーの プレイ を押します。

  1. ノーマルモードで 2〜3 ターン会話します
  2. コメディ を押します。通知が出て、Mode が comedy になります
  3. メッセージを送ります。返信がユーモラスになり、第四の壁を破ることもあります
  4. ホラー を押して、もう一度送ります。返信が暗く、張りつめた調子になります
  5. ノーマル を押して、もう 1 通送ります。語りがカード本来の文体に戻ります

プレイテストの右側にある このターン には AI が受け取ったロアエントリが並ぶので、文体エントリが 1 つだけ入っているか確認できます。

うまくいかないとき:

症状考えられる原因直し方
ボタンを押しても何も起きないボタンに 変数を変える の手順がないボタンを選んで 押したとき、順番に を確認します
Mode は変わるのに文体が変わらないエントリの条件が値と合っていないボタンが入れるのは comedy なので、条件もぴったり comedy にします
2 つの文体が両方 AI に届く片方のエントリが、いつも送られるブロックに入っている両方のエントリで AI に渡すタイミング を確認します
数ターンで文体が薄れていく文体の指示がプロンプトの最後から遠い位置にある注入先 を 最後に置く にします

コードで作る場合:最後のメッセージの下にモードボタンを出す ​

画面を自分で書いているなら、ボタンも自分で描いて、同じ変数を変えます。ステップ 2 のロアエントリはそのままです。

パネル → フロントエンドコード で index.tsx を開き、デフォルトの return <Chat /> を置き換えます。

tsx
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 に届くロアエントリ)は、難易度、一人称と三人称の語りの切り替え、物語が進むにつれて気分が変わるキャラクターにも使えます。