企画番号：３６
企画タイトル：Unity を用いた RPG ゲーム開発

活動報告
No.36 Unity を用いた RPG ゲーム開発

概要
＜目的＞
個人での開発であれば制作期間を気にすることもなく、コミュニケーションも必要ないが、本来のゲーム開発とはチームで決まった期間内に行うものである。よってこの取り組みの中でグループでの開発をすることで、自分の考えを相手に伝える力、期間内に仕上げるために計画する力を養うことが出来ると考えている。
また個人としての技術もプログラミングはもちろん、数値の管理や調整、フラグの管理といったゲーム開発に固有のテクニックについても向上が期待出来る。
＜計画＞〇一つのゲームを完成させることは、制作期間を考えると不可能なので下記の二つのシーンを制作する。
・探索シーン
非戦闘エリアのマップを作り、その中にいくつかのイベントを配置する。イベント同士に A を達成すると B が発生するといった関係を与えることでフラグ管理などのゲーム開発における技術を学ぶ。
・戦闘シーン
コマンド制の RPG を想定し、戦闘の開始からリザルト画面までの一連の流れを制作する。戦闘中の数値の管理、能力値などのバランスの調整について実践の中で学ぶ。
〇サウンドやグラフィックに関しては権利面に注意しながら、インターネット上で提供されているものを適宜利用し、必要な場合には blender などのツールを用いて制作する。
＜活動経過＞
６月 共同制作のための環境を整備
7 月～8 月上旬 定期テスト、アルバイト、コロナウイルスなどの影響で休止
8 月中旬～下旬 シナリオ、マップ製作
9 月上旬 イベントと UI の製作
9 月中旬 バトルシーンの製作
9 月下旬 イベントの追加、SE、BGM の設定＜役割分担＞
西川 シナリオプランニング、システムプランニング、プログラミング
中内 システムプランニング、プログラミング、一部 2D デザイン
＜成果、結果＞
計画ではシーンを別々で作る想定だったが、最終的には一つの流れを持った形に仕上げることが出来た。7 つのシーンで構成されシーン 1 はスタートメニュー、シーン 2 は会話のみのシーンとした。そしてシーン 3 とシーン 4 を主人公たちが探し物をする探索パート、シーン 5 を突如現れた敵と戦う戦闘パートとし、その戦闘の結果でシーン 6、7 のいずれかのエンディングに繋がるようにした。
選択肢や SE、テキストの遷移、BGM、キャラクターの移動、オブジェクトへのインタラクトなど一般的なゲームらしい要素は一通り実装することが出来た。詳しい実装は下記に示す。

＜目的＞
個人での開発であれば制作期間を気にすることもなく、コミュニケーションも必要ないが、本来のゲーム開発とはチームで決まった期間内に行うものである。よってこの取り組みの中でグループでの開発をすることで、自分の考えを相手に伝える力、期間内に仕上げるために計画する力を養うことが出来ると考えている。
また個人としての技術もプログラミングはもちろん、数値の管理や調整、フラグの管理といったゲーム開発に固有のテクニックについても向上が期待出来る。
＜計画＞〇一つのゲームを完成させることは、制作期間を考えると不可能なので下記の二つのシーンを制作する。
・探索シーン
非戦闘エリアのマップを作り、その中にいくつかのイベントを配置する。イベント同士に A を達成すると B が発生するといった関係を与えることでフラグ管理などのゲーム開発における技術を学ぶ。
・戦闘シーン
コマンド制の RPG を想定し、戦闘の開始からリザルト画面までの一連の流れを制作する。戦闘中の数値の管理、能力値などのバランスの調整について実践の中で学ぶ。
〇サウンドやグラフィックに関しては権利面に注意しながら、インターネット上で提供されているものを適宜利用し、必要な場合には blender などのツールを用いて制作する。
＜活動経過＞
６月 共同制作のための環境を整備
7 月～8 月上旬 定期テスト、アルバイト、コロナウイルスなどの影響で休止
8 月中旬～下旬 シナリオ、マップ製作
9 月上旬 イベントと UI の製作
9 月中旬 バトルシーンの製作
9 月下旬 イベントの追加、SE、BGM の設定＜役割分担＞
西川 シナリオプランニング、システムプランニング、プログラミング
中内 システムプランニング、プログラミング、一部 2D デザイン
＜成果、結果＞
計画ではシーンを別々で作る想定だったが、最終的には一つの流れを持った形に仕上げることが出来た。7 つのシーンで構成されシーン 1 はスタートメニュー、シーン 2 は会話のみのシーンとした。そしてシーン 3 とシーン 4 を主人公たちが探し物をする探索パート、シーン 5 を突如現れた敵と戦う戦闘パートとし、その戦闘の結果でシーン 6、7 のいずれかのエンディングに繋がるようにした。
選択肢や SE、テキストの遷移、BGM、キャラクターの移動、オブジェクトへのインタラクトなど一般的なゲームらしい要素は一通り実装することが出来た。詳しい実装は下記に示す。

＜実装した機能など＞〇シーン 1

・「START」と「EXIT」の間をＷキーとＳキーの操作に合わせて移動するカーソル：指定の範囲を越えて移動する問題が発生しないように if 文で現在位置から条件指定を行った。また移動に合わせて SE が鳴るようにした。これは他のシーンのカーソルにも同じものが実装されている。
・背景の歯車が回転・シーン遷移時に SE が鳴りフェードアウト：SE とフェードアウトが終わるまでシーン遷移メソッドを Invoke で待機させている。
〇シーン 2

・名前とテキスト、キャラクター画像の遷移；Enter ボタンを押すとテキストが遷移するようにし、モノローグや話者に合わせて名前やキャラクター画像が変更されるようにした。
どのボタンを押す必要があるかが視覚的に分かるように表示した。
・キャラクターの待機モーション・違和感のない背景：夕方の時間帯に見えるように環境光の設定から skybox の変更などを行った。Unity 標準の背景が見えると違和感があるため自然に見えるように心掛けてオブジェクトを配置した。これは以降のシーンでも気を付けた。
・BGM：このシーンからループする BGM を追加した。これ以降のシーンには各シーンにあった BGM が追加されている。

〇シーン 3

・WASD キーを用いたキャラクターの移動：移動時にはモーションが移動モーションに切り替わり、止まると待機モーションに戻るようにした。
シーン開始時のテキストが出ている状態でキャラクターが移動しないように、その間は移動用のスクリプトが非アクティブになるようにした。
他のオブジェクトと干渉して想定外の挙動(回転し続ける、飛んでい行くなど)をする問題が多数発生したが、ほぼすべてを解決することが出来た。
例えばインタラクト中にキャラクターが回転し続ける問題に関しては原因が分からないため、インタラクト時にスクリプトからキャラクターのオブジェクトの回転軸を固定するようにして解決した。またキャラクターが他のオブジェクトに触れた際に飛んで行ってしまう問題は見えないオブジェクトで他のオブジェクトを囲う。またはキャラクターの縦軸の移動を固定するなどして解決した。
移動が出来ることによってキャラクターがカメラワークから出てしまう問題があったため、見えないが物理判定のあるオブジェクトを置くことで移動範囲を制限した。
また完成後に発見したため解決出来なかった問題としてはインタラクト時に、テキストが表示されているにも関わらずキャラクターの移動モーションが待機モーションに切り替わらないというものがある。
・オブジェクトへのインタラクト：いくつかのオブジェクトにキャラクターが近づくと、インタラクトするためのキーが分かる UI が表示されるようにした。これはインタラクト可能なオブジェクトを見えないオブジェクトで囲い、それにトリガーを付けることで実装した。またインタラクト時にテキストが表示されるので、その間も移動用のスクリプトが非アクティブになり、移動出来ないようにした。
インタラクトするとアイテムが手に入るイベントでは、インタラクト用のスクリプトからアイテムに関連する変数を管理するスクリプトに変更を加え、その変更が後のアイテム使用時までシーンをまたいで保存されるようにした。また複数回アイテムを獲得することがないように、このイベントでは一度インタラクトすると範囲指定用のオブジェクトを非アクティブ化するようにした。
このシーンでは細い道にインタラクトした場合に選択肢が表示される。これを強調するために画面を、UI を除いて暗くするようにした。また選択肢で“NO”を選択するとインタラクトする前の状態に戻り、すぐにもう一度インタラクト出来るように範囲指定の方法に工夫した。

〇シーン 4・パーティクルによる演出 1：このシーンではパーティクルをアイテムの表現として用いた。移動や消滅時間などの設定を変更して常に留まっているようにした。
・シーン中の暗転：このシーンではアイテムにインタラクトした際、キャラクターがものを拾うモーションをし、その後上図のように NPC が移動する。しかし座標を瞬時に変化させると不自然に見えるので、この間に暗転を追加した。この時同フレーム中にモーションと暗転がされるのでモーション見えない問題が発生したため、Invoke でモーション中は暗転を待たせるようにした。
〇シーン 5・戦闘システム：戦闘システムはターン制戦闘を採用した。ターンを管理するスクリプト、敵の行動を管理するスクリプト、プレイヤーキャラの行動を管理するスクリプトの三つが、互いの変数に干渉しあうことで実現した。スクリプトが三つあることでターンの切り替わりがはっきりしないなどの問題が発生したため、随所で Invoke によってタイミング調整を行った。
・階層型メニュー：“SKILL”コマンド、“ITEM”コマンドの二つは二層構造になっており、選択時に下位メニューが表示される。“EXIT”を選択すると上位メニューに戻ることが出来るようになっている。
・ログ：右上の UI に状況に応じたログが表示される。

・アイテム：今回は体力を回復出来るアイテムを一種類だけ実装した。シーン 3 で獲得していない場合、左上の図のように「×0」と表示され、選択すると「アイテムが不足している」とログが表示されるようにした。
また体力が減っていない時に選択すると「今は使う必要がない」と表示される。回復の最大値よりも受けているダメージが小さい時に使用した場合、体力の最大値までのみ回復するようにした。
完成後に出た意見で「×0」と表示される部分は、そもそもアイテムの表示がされない方が自然ではないかというものがあった。

・パーティクルによる演出 2：特別な攻撃には演出にパーティクルを用いた。演出が冗長にならないよう、消滅時間とターン進行のバランスを調整した。
・勝利、敗北時の演出：現状戦闘終了時に演出がなく、即座に遷移してしまう。今後の制作ではより演出にもこだわってい
きたい。
・タイミング処理：現状タイミングはフレームではなく実時間を基準に Invoke で遅延を行っており、実行環境によるずれを出力 FPS の固定で減らしている。今後はフレーム基準でより実行環境によるずれがないものにしたい。

〇シーン 6、7・シーン遷移の分岐：シーン 5 の戦闘の結果に応じて遷移先のシーンが異なるようにした。
・ゲームの終了：ゲームの終了には、ゲーム進行に最も多く用いた Enter キーに設定した。
現状ではこのシーンでしかゲーム内からゲームを終了出来ないが、今後の作品では全てのシーンでポーズ画面かデータセーブやロード、ゲームの終了などが出来るようにしたい。