NarraLeaf

例:好感度とマルチエンディング

セーブ変数で好感度を記録し、選択肢で変更し、ブループリント値で会話ボックスに表示し、その値に応じてエンディングを分け、タイトルページに到達したエンディングの数を表示します

この例では、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 と同じ結果になります。

部室の 2 つの選択肢の最後にそれぞれ inc の行があり、右側の Variables パネルのセーブ変数に好感度(数値、既定値 0)と正直がある

3. 会話ボックスに好感度を表示する

テキストを追加する

左のアクティビティバーで UI を選び、Interfaces(インターフェース)で Game UI(ゲーム UI)を選んで「会話」を開きます。キャンバスの下のツールバーから Text(テキスト)を会話帯の右側にドラッグし、名前を 好感度 にして文字を右揃えにします。ネームタグの右側の位置は X 1420、Y 754、サイズは 320 × 46 です。

テキストにブループリント値を使う

テキストを選択し、プロパティパネルの Content(内容)で Text(テキスト)を Direct(直接入力)から Blueprint Value(ブループリント値)に切り替えます。Studio がブループリント値を作成し、元の文字はエディターでのみ表示される Sample text(サンプルテキスト)になります。Open Blueprint Value(ブループリント値を開く)をクリックします。

UI エディターで開いたゲーム UI の会話。選択したテキストはプロパティパネルでブループリント値を使い、サンプルテキストは Affection: 30

グラフを組む

ブループリント値には、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 へ
好感度のブループリント値:Init から Get Saved Var と Return Value に接続し、セーブ変数の値は Concat でラベルを付けて Return Value に渡される

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

開発モードで Narra の質問のあとに 2 つの選択肢が表示され、会話ボックスの右側に Affection: 30 が表示されている

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 はその行でストーリーを終了し、プレイヤーが到達したエンディングを記録します。

最後の光の末尾にある 3 つの分岐。どれもエンディングの行で終わり、選択した最初の分岐の条件式がプロパティパネルに表示されている

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(値):TrueArray を 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 つずつ使います。エンディングのフィールドと、それを読み取るほかのノードは構造体にまとめてあります。

エンディングのブループリント値:2 つの Get Endings のうち 1 つは Array Filter By Key と Array Length を、もう 1 つは Array Length のみを通り、2 つの数値が Make Array に入り、Format で文字列になる

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

開発モードのタイトルページ。ゲームタイトルの下に Endings reached 1 / 3 と表示されている

テスト

  • 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(成立し得ない条件)を報告し、その位置での 好感度 の範囲を示します。
好感度に注目したシーンフロー:到達時の値は廊下で 0、部室で 0-10、最後の光で 10-30。展開した分岐に選択肢ごとの増加量と 3 つのエンディングの分岐が示されている

関連ページ

このページの目次