i-school - テキスト型アドベンチャーゲームの設計を考える

テキスト型アドベンチャーゲームの設計を考える

 Unityのバージョンは2019.4.xf1、あるいは2020.1.xf1にて製作を行う前提です。
 
 ゲームのジャンルは2Dゲーム、テキスト型アドベンチャーゲームです。
基礎設計が出来上がれば、シナリオを変えることにより汎用的に使用することが出来ます。

 少なくても以下の内容について、詳細な設計を考えていく必要があります。

・ゲーム性(Canvasのみでゲームを製作、タップのみでゲーム進行、など)

・画面のデザイン(UIの配置。メッセージの表示位置、キャラクターの表示位置、など)

・必要なシステム・機能(シナリオを用意する方法、用意したシナリオをゲーム内に読み込み方法、シナリオに合わせたメッセージの表示、キャラクターの表示、シナリオの分岐、など)

・シナリオの作成・管理(データベースの作成方法、利用方法、など)

・演出(アニメーション、画面のエフェクト、など)

・ゲームのサイクル(シナリオの分岐によるストーリー変化、エンディング変化、ゲームクリア前後で変化する内容を設定するか否か、など)

 1つずつ設計を行っていきましょう。

ゲーム性

1.Canvasのみでゲームを製作する


 2Dゲームのテキスト型アドベンチャーゲームということですので、今回はゲームシーンの製作については、Canvas内のみでゲームを製作するようにします。
そのため、ヒエラルキー上にはまずCanvasを用意し、その中に必要なゲームオブジェクトを配置していく手法でゲームを製作していきます。

2.シナリオ(ストーリー)を読んで楽しむゲームにする

 
 テキスト型アドベンチャーゲームですので、シナリオが重要になってきます。
ここではシナリオとは、ゲーム全体のお話が書いてる脚本を表します。と同時に、ゲーム的な複合型のデータでもあります。
何故かというと、シナリオとはお話だけではなく、どういった場面で、誰が話をしていて、一緒に誰がいて、といった情報も同時に用意しておく必要がであるためです。

 小説のページをめくるような気持ちでゲームに表示されるシナリオを読んで頂き、それを読み進めてお話の世界に没頭して頂くゲーム性になります。

3.タップのみでゲーム進行する


 用意されたシナリオは、一度にすべてを表示してしまうようなことはあってはなりません。
登場人物の気持ちとユーザーとがリンクし、少しずつ、シナリオを読み解いていくことで、新しい展開に心を躍らせるような仕掛けを作るべきです。

 そのため、シナリオを少しずつ切り分けて段落に分けます。これをパラグラフと定義します。
そしてパラグラフの中にあるテキストをさらに少しずつ画面上に表示していくようにします。この時に表示されるテキストをメッセージと定義します。

 表示されたメッセージは、画面上のいずれの部分をタップすることで、表示されているメッセージが消えて、次の新しいメッセージが表示されるようにします。
つまり、メッセージを読み終わったらタップして次のメッセージを表示し、それを読み終わったらまたタップして、という流れで進行していくようにします。

 用意されているパラグラフ内のメッセージがすべて表示された場合、次のパラグラフへの選択肢(分岐)が画面上に数種類表示されます。
この選択肢はユーザーが、ゲーム内においてどのような振る舞いをするかを選択する内容のボタンになっており、いずれか1つのみを選択できるようにしておきます。
 そしてユーザーが選択したボタンによって、ゲームの展開が決まり、次に用意するパラグラフが変化していくようにします。

 

・画面のデザイン

1.UIの配置


 Canvas内にてゲームを製作するようになりますので、画面に表示・設置するゲームオブジェクトについて設定をしておく必要があります。

 ・メッセージの表示位置(ウインドウを用意し、その中にメッセージが表示される)。ウインドウの位置は固定。
 ・会話中、あるいは会話に参加しているキャラクターの表示位置(1人〜複数人まで表示できるように、また画像の大きさなども考える)。
    縦位置は固定だが、横位置はキャラクターの人数で自動調整するようにする(表示が一人なら中央に、二人なら中央から見て左右にバランスよく配置。)
 ・会話中のキャラクターの名前の表示(ユーザーが話している時や三人称視点での会話の場合には、名前を出さないようにする)。表示の位置は固定。

 基本的にはこれらのUIがあれば問題ないでしょう。

2.ゲームの世界観に沿ったUIのデザイン


 メッセージの表示されるウインドウは常にゲーム中表示されていますので、そのデザインや、文字に使用するフォントの種類が見にくかったりするとユーザーは疲れてしまいます。
世界観に凝ったデザインもよいですが、見やすさ、読みやすさも一緒に考えて、バランスを保ちましょう。
 

必要なシステム・機能

1.シナリオを用意する


 アドベンチャーゲームですので、どのようなお話・シナリオを用意するかが重要になっておきます。
 恋愛もの、ホラーもの、異世界ものなど、色々なシナリオがあると思いますが、小説とは異なり、ゲームの場合には
台詞ごとにどのキャラクターが話しているのか、三人称で説明をしているのか、次はどんな場面への分岐が可能なのか、など
そういった情報も含めて、シナリオをデータとして作成していく必要があります。
 
 作り方は色々あると思いますが、今回はExcelにてシナリオのデータを作成し、それを利用する方法で設計します。

2.用意したシナリオをゲーム内に読み込む


 Unityでは外部の拡張機能を採用することによってExcelにて用意したシナリオ用のデータを直接参照する方法もありますが
今回は、ExcelのデータをJsonという言語間のデータ交換が可能なテキストのファイルとして書き出して、それをUnityにて読み込んで使う方法にて実装を考えます。
具体的な方法については後述します。
 

3.メッセージを1文字ずつ順番に表示する(要所にて選択肢を表示する)


 文字送りと呼ばれる機能です。キャラクターが話しているように見せる演出として、一気にメッセージを1ページ分表示するのではなく
1文字ずつ順番に文字が表示されていくようにします。
 ただしユーザーによっては早くメッセージを表示して読みたいという要望もあるため、
文字を表示中に画面をタップしたら、1ページ分の文字を一気に表示させる機能も必要になります。
 
 そしてパラグラフ(段落)内に用意されたメッセージがすべて表示されたら、最後にボタン型の選択肢を表示します。
選択肢には説明があり、主にユーザーの行動を選択するようになっていて、その選択肢に応じて、次のパラグラフが決定します。

 このメッセージ表示と分岐表示の部分が、システムの根幹となる部分ですので、しっかりと作っていく必要があります。

4.メッセージとキャラクター表示を同期させる


 メッセージを表示している間、その会話をしているキャラクターの立ち絵とメッセージとを同期させて画面に表示するようにします。
そうしないと、どのキャラクターが話をしているのか、わかりにくく、会話が成り立たなくなります。

 また、会話形式が1対1ではない場合もありますので、1人対複数といった会話形式の場合にも、会話に参加しているキャラクターは
すべて画面上に表示されているように制御する必要があります。

5.背景と音楽をシナリオを同期させる


 主にパラグラフが変化した際(シナリオが分岐した際)には、場面が転換したり、時間が経過したりといったことが起こりえます。
そのような場合には、背景用の画像や音楽(BGM)もまた、シナリオのパラグラフに応じて同期させていく必要があります。

シナリオの作成・管理

1.シナリオのデータとして必要なもの


 シナリオのデータは、複数のパラグラフ(段落)単位でまとめて作成していきます。

 1つのパラグラフにはさらに、複数のメッセージ、そのメッセージを話すキャラクターの指定、キャラクターの立ち絵の表示、背景画像の情報、BGMの情報、
そしてシナリオの分岐というデータが必要になります。

 他のジャンルのゲームに比べるとシステム的な実装は少ないのですが、このシナリオのデータはたくさん必要になります。

2.スクリプタブル・オブジェクトを使用して、シナリオのデータベースを作成し、管理する


 ExcelのデータをJson化し、それをUnityに読み込むことで、作成したシナリオのデータをゲームに反映して利用いきます。
この際に、今回はUnityの持つデータベース機能であるスクリプタブル・オブジェクトを使用します。

 スクリプタブル・オブジェクトを作成し、そこにJsonファイルを読み込んでデータベースを作り、
そのデータベースにあるシナリオのデータをパラグラフ単位で読み込ませることで、ゲーム内で運用していきます。
複数あるデータの中からどのようにして該当のパラグラフを見つけるのか、見つけたデータをどのように適用するのかを学習します。
 

演出(エフェクト)

1.DoTweenを使用してアニメーション演出をする


 DoTween(ドットゥイーン)とは無料アセットの1つで、広く使われているTween(トゥイーン)系のアセットです。
Tweenとはゲームオブジェクトの途中経過情報を補間して表現することを言います。
例えば、Aというゲームオブジェクトが現在の地点から別の地点に移動するに際し、その移動する間の情報を補間して表現することが出来ます。
この補間表現機能を利用することにより、様々なアニメーション演出を実装出来ます。

 またDoTweenには、この機能が終了するタイミングを待って別の処理を呼ぶことや、途中で補間処理を中断したりといったことも出来ます。
Transformコンポーネントに対しての補間機能が多くありますが、それ以外にも使用方法は多岐にわたります。

 特に今回は文字送りの部分にDoTweenの持つ機能の1つであるDoTextという機能を使って、1文字ずつ表示したり、一気に表示したりする表現を実装していきます。

2.画面のエフェクト


 画面をフラッシュさせたり、暗転させたりといったものだけではなく、キャラクターを揺らしたり、文字を一部だけ大きくしたりなど
画面を通じて行える演出はたくさんあります。これらはシナリオに応じて適した内容のエフェクトを適宜いれていくことで、ゲームの臨場感や没入感が変わってきます。
 
 やりすぎず、少なすぎず、バランスを見ながら考えて実装しましょう。

ゲームのサイクル

1.ゲームの流れ

 
 メッセージを読み進めて、パタグラフの最後に表示される選択肢を選んでいくことで、用意したシナリオが分岐してストーリーの変化が楽しめる作りにします。
その途中、あるいは一番最後にはエンディングがあります。

 エンディングが1つなのか、あるいは途中にゲームオーバーになることがあるのか、などこれらも作成したシナリオに応じて変化することになります。

 まずは前提として、分岐の途中にゲームオーバーになることがあるのか、ないのかを決定しましょう。
ゲームオーバーがないのであれば、すべてのユーザーは1回のゲームプレイでエンディングまでたどりつくことになります。
ゲームオーバーがある場合には、再開する場面を考えていく必要があります。リスタート地点を作るのであれば、それはシステムとして組み込むことを考えるべきでしょう。

 続いては、エンディングの種類が1種類なのか、複数あるのかを考えましょう。

 最後に、ゲームクリア前後で変化する内容を設定があるのかないのかを考えましょう。
例えば1回エンディングまで行ってクリアしないと表示されない選択肢がある、などです。


 設計の項目については、以上になります。詳細については実装する際の手順内にて説明を補記していきます。
また、これら以外にもシナリオによって用意するべきものがあるのであれば、それらも考えておきましょう。