例:好感度とマルチエンディング
セーブ変数で好感度を記録し、選択肢で変更し、ブループリント値で会話ボックスに表示し、その値に応じてエンディングを分け、タイトルページに到達したエンディングの数を表示します
この例では、Skeleton(スケルトン)テンプレートで作成したプロジェクトに好感度の仕組みを実装します。
- 選択肢でセーブ変数
好感度を増やします。 - 会話ボックスの右側に
好感度の現在の値を表示します。 好感度が 20 以上のとき、追加の分岐が再生されます。- ストーリーは
好感度と正直に応じて 3 つのエンディングのいずれかで終わります。 - タイトルページに到達したエンディングの数を表示します。
| 部品 | 場所 | 役割 |
|---|---|---|
セーブ変数 好感度 | Variables(変数)パネル | 好感度を保持します。セーブとロードで保存・復元されます。 |
/inc、/if、/ending | シーン | 好感度を増やし、好感度で分岐し、エンディングを記録します。 |
| ブループリント値 | ゲーム UI「会話」のテキスト | 好感度 を読み取って表示します。 |
Get Endings(エンディング一覧を取得) | ページ「タイトル」のテキスト | 到達したエンディングの数を表示します。 |
| エンディング | 条件 |
|---|---|
| 一緒に文化祭 | 好感度 が 35 以上で、部室で「正直なものを。」を選んだ |
| 明日も同じ時間 | 好感度 が 20 以上 |
| 部活をやめた | それ以外 |
準備
Skeleton(スケルトン)テンプレートで新しいプロジェクトを作成します。手順ははじめにを参照してください。スケルトンには「廊下」「部室」「最後の光」の 3 つのシーンがあります。「部室」のメニューは選択をセーブ変数 正直 に書き込み、「最後の光」は 正直 に応じて異なる台詞を表示し、エンディング「明日も同じ時間」で終わります。
以下の手順では、変数を宣言し、3 つのシーンを順に変更したあと、ゲーム UI「会話」とページ「タイトル」を変更します。
1. 変数を宣言する
右サイドバーで Variables(変数)を開き、Saved variables(セーブ変数)の Add(追加)をクリックします。新しい変数の名前を 好感度 にし、型を Number(数値)にして、既定値は 0 のままにします。
セーブ変数はプロジェクト全体に属し、すべてのシーンとブループリントから読み書きできます。値はセーブに書き込まれ、ロード時に復元され、新しいゲームを始めると既定値に戻ります。ほかのスコープについては変数を参照してください。
2. 選択肢で好感度を変更する
廊下
Narra の台詞「一人半ね。暗くなる前に帰っちゃうんだから。」のあとに行を追加し、/menu と入力して Enter を 2 回押します。Studio がメニューと最初の選択肢を挿入します。メニューの行で Add option(選択肢を追加)をクリックして 2 つ目の選択肢を追加し、選択肢をダブルクリックして文を入力します。次に、選択肢の Add action inside(中にアクションを追加)をクリックし、その選択肢を選んだときに実行する行を入力します。
| 選択肢 | 選択肢の中の行 |
|---|---|
| 今日は最後までいる。 | Narra:「じゃあ、今日は一緒に戸締まりしよう。」/inc 好感度 10 |
| 今日は別の用事がある。 | Narra:「わかった。」 |
部室
メニュー「何を作る?」の 2 つの選択肢には、それぞれ /set 正直 … の行があります。それぞれの行のあとに次の行を追加します。
| 選択肢 | 追加する行 |
|---|---|
| 正直なものを。 | /inc 好感度 20 |
| ちゃんと人が来るものを。 | /inc 好感度 10 |
/inc 好感度 20 と入力して Enter を押すと、行は inc 好感度 20(日本語のインターフェースでは 増加 好感度 20)と表示されます。数値を省略すると /inc は 1 を加算します。/dec は値を減らします。/set 好感度 好感度 + 20 は /inc 好感度 20 と同じ結果になります。

3. 会話ボックスに好感度を表示する
テキストを追加する
左のアクティビティバーで UI を選び、Interfaces(インターフェース)で Game UI(ゲーム UI)を選んで「会話」を開きます。キャンバスの下のツールバーから Text(テキスト)を会話帯の右側にドラッグし、名前を 好感度 にして文字を右揃えにします。ネームタグの右側の位置は X 1420、Y 754、サイズは 320 × 46 です。
テキストにブループリント値を使う
テキストを選択し、プロパティパネルの Content(内容)で Text(テキスト)を Direct(直接入力)から Blueprint Value(ブループリント値)に切り替えます。Studio がブループリント値を作成し、元の文字はエディターでのみ表示される Sample text(サンプルテキスト)になります。Open Blueprint Value(ブループリント値を開く)をクリックします。

グラフを組む
ブループリント値には、Init(初期化)から Return Value(値を返す)への接続と、元の文字を渡す String(文字列)がすでにあります。String を削除し、次のノードを追加して接続します。
| ノード | 設定 | 接続先 |
|---|---|---|
Init(初期化) | 実行を Get Saved Var へ | |
Get Saved Var(セーブ変数を取得) | Saved variable(セーブ変数):好感度 | 実行を Return Value へ。Value(値)を Concat の B へ |
Concat(連結) | A:好感度: | Result(結果)を Return Value の Value へ |

ブループリント値が読み取るセーブ変数に書き込みがあるたびに、テキストは再評価されます。/inc の実行時、ロード時、新しいゲームの開始時に、会話ボックスの値が更新されます。

4. 好感度で分岐する
「最後の光」で、正直 の条件のあと、Narra の台詞「明日も同じ時間。遅れないで。」の前に行を追加し、/if 好感度 >= 20 と入力して Enter を押します。If の下に次を追加します。
- Narra:「帰り、駅まで一緒に歩く?」
- メニュー。選択肢「うん。」の中に Narra:「じゃあ、行こう。」と
/inc 好感度 15、選択肢「今日はやめておく。」の中に Narra:「わかった。また今度。」
好感度 が 20 未満のときは分岐全体が飛ばされます。この条件には Else(それ以外)がないため、ストーリーは次の行に進みます。
/if の条件は式で、比較演算と &&、||、! を使えます。プロパティパネルで条件を Variable(変数)に切り替え、ドロップダウンで変数と比較方法を選ぶこともできます。
5. 3 つのエンディング
「最後の光」の末尾にある 2 行のナレーションとエンディング「明日も同じ時間」を削除します。シーンの末尾で /if 好感度 >= 35 && 正直 と入力して Enter を押し、条件の行で Else if(そうでなくもし)と Else(それ以外)をクリックして、残り 2 つの分岐を追加します。
| 分岐 | 条件 | 分岐の中の行 |
|---|---|---|
| If | 好感度 >= 35 && 正直 | ナレーション「文化祭の日、Narra と一緒に部室の準備をした。」/ending 一緒に文化祭 |
| Else if | 好感度 >= 20 | /ending 明日も同じ時間 |
| Else | ナレーション「それから、部活には行かなくなった。」/ending 部活をやめた |
/ending はその行でストーリーを終了し、プレイヤーが到達したエンディングを記録します。

6. エンディングのあとタイトルページに戻る
Project(プロジェクト)→ App(アプリ)を開き、Build variants(ビルドバリアント)で main を展開して、Page shown when the story ends(ストーリーが終わったときに出すページ)を「タイトル」にします。ストーリーがエンディングの行で終わったあと、このページが表示されます。個別のエンディングの行には、プロパティパネルの Page shown afterwards(終了後に表示するページ)で別のページを指定できます。
7. タイトルページに到達したエンディングを表示する
プレイヤーが到達したエンディングはセーブの外に記録されます。ロード、新しいゲームの開始、ゲームの再起動では消えません。
ページ「タイトル」を開き、タイトル区切り線の下に Text(テキスト)を追加して名前を エンディング にします。Text を Blueprint Value(ブループリント値)に切り替えて開きます。
Get Endings(エンディング一覧を取得)を追加し、Story(ストーリー)を スケルトン にします。Endings(エンディング一覧)出力の型は Ending list(エンディングのリスト)です。Endings からワイヤーを引き出してキャンバスの空いた場所で離すと、ノード追加メニューが Fields(フィールド)のグループで開き、エンディングの各フィールドでできる操作が並びます。Filter by isReached(isReached で絞り込み)を選ぶと、Studio は Key(キー)が isReached、Value(値)が True の Array Filter By Key(配列をキーで絞り込み)を追加し、Endings をその Array(配列)に接続します。
残りのノードを追加し、次のように接続します。
| ノード | 設定 | 接続先 |
|---|---|---|
Init(初期化) | 実行を Return Value へ | |
Get Endings(エンディング一覧を取得) | Story(ストーリー):スケルトン | Endings(エンディング一覧)を Array Filter By Key の Array(配列)へ |
Array Filter By Key(配列をキーで絞り込み) | Key(キー):isReached、Value(値):True | Array を Array Length へ |
Array Length(配列の長さ) | Length(長さ)を Make Array の Item 1(項目 1)へ | |
Get Endings(エンディング一覧を取得) | Story:スケルトン | Endings を 2 つ目の Array Length へ |
Array Length(配列の長さ) | Length を Make Array の Item 2(項目 2)へ | |
Make Array(配列を作る) | 項目 2 つ | Array を Format の Values(値の一覧)へ |
Format(整形) | Template(テンプレート):到達したエンディング {0} / {1} | Result を Return Value の Value へ |
Get Endings はストーリー内のすべてのエンディングの行を列挙します。各エンディングの isReached フィールドは、プレイヤーがそのエンディングに到達したかどうかを示します。1 つ目の Get Endings は到達したエンディングを絞り込み、2 つ目はすべてのエンディングを数えます。同じ Endings 出力から 2 本目のワイヤーを引くと 1 本目が置き換わるため、それぞれの数に Get Endings を 1 つずつ使います。エンディングのフィールドと、それを読み取るほかのノードは構造体にまとめてあります。

テンプレートはグラフ内に書いた文字で、ゲームの言語では切り替わりません。プロジェクトに複数の言語があるときは、Translation Key Text でテンプレートを渡します。

テスト
- F5 を押すと、プロジェクトが開発モードで実行されます。行の Play from this row(この行から再生)をクリックすると、その行から実行されます。
- 開発モード左下のデバッグボタン → Story(ストーリー)→ Variables(変数)に、セーブ変数の現在の値が表示され、その場で変更できます。
好感度を 40 にし、正直をオンにしてから最後まで進めると、エンディング「一緒に文化祭」を確認できます。 - 開発モードボタンの横の矢印 → Reset player data(プレイヤーデータをリセット)→ Dev Mode(開発モード)で、開発モードのすべてのセーブとエンディングの記録が消去されます。タイトルページは
到達したエンディング 0 / 3に戻ります。 - Story(ストーリー)パネルで Open Scene Flow(シーンフローを開く)をクリックし、変数の一覧で
好感度を選びます。各シーンに到達時の好感度の範囲が表示され、Show branches(枝を表示)で選択肢ごとの増減量と、エンディングで終わる分岐が表示されます。 - 条件の基準値がどのルートでも到達できない値のとき、Problems(問題)パネルが Condition no path can satisfy(成立し得ない条件)を報告し、その位置での
好感度の範囲を示します。
