【Unity】RPGを作るチュートリアルその128 チュートリアルのまとめ

【Unity】RPGを作るチュートリアルその128 チュートリアルのまとめ

シンプルなRPGをUnityで作るチュートリアルシリーズの128回目です。開発者的にはとてもキリの良い数字で終わりになったのでとても嬉しいです。

第127回ではテスト時のポイントの総括やリリースビルドに向けた準備について確認しました。

今回はチュートリアルのまとめを行います。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回はテスト時のポイントの総括やリリースビルドに向けた準備について確認しました。

 

このチュートリアルでやったこと

ここまでの長時間のチュートリアル、お疲れ様でした。なるべく規模を抑えつつも、RPGを作っていく際の拡張性も考えで作成できるものを考えていたので、なんだかんだ長くなりましたね(白目)

RPGを作っていくならその土台から作る必要があるので、早めにリリースするならRPGツクールなどの既製品を使うのがおすすめです。しかし、自力で作成してその仕組みを理解することで技術が身につき、応用していく際にも役立てることができます。技術を学んだ後にRPGツクールを使うことで「あのめんどくさい作業を省いてくれてありがとうございます……!」とありがたみを感じることもできます。

知識や技術の整理のため、このチュートリアルでやったことをまとめていきましょう。

 

プロジェクトのセットアップ

作成するRPGの表現形式に応じて、プロジェクトのテンプレートを選択しました。今回は2Dの見下ろし型のRPGを作成したので、2D用のプロジェクトをセットアップする手順を行いました。

フォントのインポートやTextMesh Pro用のフォントテクスチャの作成など、開発の土台となる部分を作成しました。

 

キャラクターの移動機能

2Dの見下ろし型のRPGとしてキャラクターを移動させる機能を実装しました。Tilemapを使うことで、グリッド状のマップを作成しやすくなります。近年のRPGでは、2Dでもマス目に沿わずに自由に移動できる形式もあるので、表現したい形式や操作感と合わせて選択していけると良いかと思います。

移動の制御については制御用のクラスを作成しました。Tilemap全体を管理するクラスだったり、キャラクターの移動を制御するクラスだったりと、制御に必要なクラスをいくつか分けて作っておくと改修や機能追加をしやすくなります。

キャラクターの位置を保持するための仕組みも実装しており、今回はグリッド状のマップに沿って移動することから、マップIDやVector2Intを使った位置座標の保持も行いました。画面上でどこにいるか、データ状でどこにいるか、これらの整合性をとった形で保持するようにすると扱いやすくなります。

 

定義データの作成

ゲーム内で必要な定義データをScriptableObjectの形で作成しました。RPGの場合、定義データを参照する箇所はとても多いので、定義データへのアクセス方法は簡単にしておくと便利です。

アイテム、魔法、味方キャラクター、敵キャラクター、マップ情報、などなど、アイディアに応じて必要な情報も増えていくので、事前に洗い出しをしておくと実装が楽になります。

今回はスタンドアロンのゲームを想定していたのでScriptableObjectを使用していますが、ネットワークを使うゲームであればサーバ側にデータを持たせて、JSON形式でやり取りするのもひとつの方法です。動的な調整もしやすいので、ビルド自体のアップデートの回数を減らせる可能性もあります。

 

戦闘関連の機能の作成

RPGを遊ぶ際に多くの時間を使う戦闘部分を実装しました。こちらは開発時にも多くの時間を使う部分です。戦闘に関しては入力、処理、入力、処理、とループで進んでいくので、入力を処理しやすい形式で管理クラスを実装しておくと便利です。今回のチュートリアルだと「BattleAction」という形で戦闘中の行動を定義して、カテゴリに応じた処理を行うクラスを作成しました。

戦闘に関してもターン制だったり、リアルタイムバトルだったり、カウントタイムバトルだったりと、形式は様々です。作りたいゲームの戦闘のイメージを事前に固めておいて、それに応じた実装形式を選べると良いかと思います。

戦闘では味方キャラクターの状態に頻繁にアクセスすることもあり、簡単にアクセスできる仕組みを用意しておくと便利です。

 

エンカウント機能の作成

戦闘機能をどのように呼び出すかも重要で、今回のチュートリアルではランダムエンカウント方式で実装を行いました。ランダムエンカウントでは、次にエンカウントが発生するまでの確率の計算も行いました。今回はシンプルに乱数での確認でしたが、乱数である以上1歩でエンカウントする可能性もあるため、数歩は歩けるようにするなど、制御を追加するとストレスを減らせます。

また、マップ単位でのエンカウント率を設定できるようにして、出現する敵キャラクターについてもマップごとに調整できるようにしました。より発展的な方法として、同じマップ内でもエンカウント率や敵キャラクターを変える方法もあります。例えばエリア判定用のColliderを使用して、Colliderとエンカウント設定を紐づける方法が考えられます。規模が大きくなってきた場合は、こうした機能なども入れていくと良いかと思います。

戦いたい時に戦うシンボルエンカウントを実装するのもRPGでよくある方法です。ダッシュして敵キャラクターを避けるなど、移動機能とも組み合わせるとユーザの選択肢が増えてゲーム性が出てくるかもしれません。

 

メニュー機能の作成

マップ上を移動している際にメニューを表示する機能を実装しました。メニューに関してはRPGの準備フェーズとして重要な要素です。現在の状態の確認や、アイテムや魔法の使用、セーブ機能など、メニュー画面から呼び出す機能は多岐に渡ります。

今回はカスタマイズ要素が装備のみですが、近年のドラクエのようなスキルポイントだったり、FFのジョブチェンジ、ジャンクション、スフィア盤などなど、強さをカスタマイズするための機能を呼び出す起点としてもメニューが使われます。戦闘をより有利に進めるための準備ができる場所なので、どの項目を選択したらどんなカスタマイズができるのか、意図と機能がマッチする形で実装できると良いかと思います。

 

イベント機能の作成

マップ上で会話やお店などの動作を行うイベント機能を実装しました。イベント機能もRPGでは重要な要素で、キャラクターとの会話やアイテムの増減、お店の呼び出しなど、必要な動作を呼び出せる形で実装を行いました。

イベント単位でコードを書いていくのは大変なので、今回のチュートリアルではイベントプロセスという形でカテゴリ単位のコードを用意して、Inspectorウィンドウから変数を設定することで表示する値などを変更できるようにしました。エディタ拡張をなるべくしない方向で進めたのでこのような形にしていましたが、イベントを編集するためのエディタなども用意すると作業がしやすくなります。

 

お店の機能の作成

RPGでは重要なお店の機能についても実装しました。お店の機能はイベント機能から呼び出す形で実装していて、Inspectorウィンドウから品揃えを変更できるようにしています。これによって、違う街では別の品揃えになるようにしています。

お店のUIなどはゲームごとに特色のある部分なので、ゲームの雰囲気と合わせて実装していくと良いかと思います。このチュートリアルでは初期のドラクエらしさをイメージして作成していました。

 

タイトル画面の作成

ゲームとしての全体の動きを作っていくため、タイトル画面を作成しました。初回はゲームの冒頭から進め、次回はセーブした地点から進める、というRPGの基本の流れを踏襲する形にしています。

今回はタイトル画面、ゲーム画面の2シーンで構成していますが、リリースするゲームだとリソースを読み込んだり、自社や協力会社さんのロゴを出したりと、ユーザが選択する前にやっておく準備作業などもあるため、さらに初期化用のシーンを入れても良いかと思います。

 

オーディオ機能の実装

ゲームの雰囲気が増すオーディオ機能についても実装しました。BGMや効果音の有無によってゲームらしさの印象が変わるので、重要な要素です。今回のチュートリアルでは完全に後回しで実装しましたが、BGMや効果音を再生するポイントについてはある程度あたりをつけておくと良いかと思います。

例えばコード内から効果音を再生するなら、コード内のコメント文として効果音を再生する旨を残しておくことで、後で埋め込むのに手間が省けます。この際は指定した文字列で検索できるように事前にコメント文も決めておくとさらに手間が省けるかと思います。

ゲームの序盤からBGMや効果音を入れていくなら、フリー音源などを当てこんで、後から差し替えていくのもひとつの方法です。

 

ビルドとデバッグ

ゲームを遊べる形でビルドしました。また、リリース先のプラットフォームを想定したデバッグ作業についても行いました。

今回のチュートリアルでは後半にビルドを行いましたが、実際の開発では早め早めでビルドを行なっておくとエラーに気付きやすくなります。例えばAddressables関連の動作については、Unityエディタと実機ではリソースの参照方法が異なるため、思わぬNullReferenceが発生したりします。こうした部分を早めに潰しておくと後半に焦らずに済みます。

 

このチュートリアルでやらなかったことと拡張案

今回のチュートリアルではなるべく規模を小さくする意図から省いている部分もあります。拡張案としてはその省いた部分の実装が主になります。

 

エフェクトの実装

マップ状でのエフェクトや戦闘中のエフェクトについては省略しました。リソースの作成にかかる時間を減らしたい意図もあり、戦闘時のアクションはシンプルになりました。

もしエフェクトを追加していくなら、全体の雰囲気に合わせてドット絵感のあるエフェクトだとマッチしそうです。エフェクトに合わせて、画面が光ったり、画面が揺れたりなどの演出も追加するとより雰囲気が出てきます。

戦闘に入る際の演出なども、今回のチュートリアルではSetActive()による0フレームでの切り替えでしたが、フェードインやトランジションを入れて切り替わりの印象を強めるのも大切です。

 

カスタマイズ要素

上で少し触れたように、装備品以外のカスタマイズ要素は省略しました。近年のゲームであればスキルポイントだったり、ジョブシステムだったりと強くなるためのカスタマイズ要素が含まれていることが多いかと思います。チュートリアルでやったことを拡張していく際にはこうした要素を入れていくと良いかと思います。

スキルポイントを導入するなら何ポイントで習得できるのかの定義データも用意しましょう。また、レベルアップとは別の強化要素になるので、戦闘シミュレーションを行う際には、習得しているスキルをInspectorウィンドウなどから選べるようにしておくと便利です。

ジョブシステムを導入するなら、ジョブごとのステータス補正を行う処理も必要になりそうです。基礎値を保持しつつ、画面上に表示するのは補正後の値にするなど、計算の仕組みも入れておくと良いでしょう。

 

戦闘中のイベント

戦闘中に会話するなど、イベントが発生する機能についても省略しました。RPGではボス戦などで会話が発生することも多いので、こうした部分を追加していくとRPGらしくなります。味方が全回復するイベント、ボスのグラフィックが変わるイベントなどがあるとより盛り上がりを生み出せます。

イベントを戦闘中のアクションのひとつだとすれば、「BattleAction」のカテゴリを増やしてイベントを作成し、対応するイベントを確認するなどの動作を入れる方法が考えられます。敵キャラクター単位だとイベントの制御が大変になりそうなので、敵パーティを定義するようにして、それと紐づく形で戦闘中のイベントを用意すると良いかもしれません。

イベントの開始条件はフラグにしておいて、敵キャラクターがイベントのフラグをTrueにする魔法を使うようにする方法もあります。あるいは開始条件をターン数にして、戦闘中のターン数を参照する形も良いかもしれません。ターン数については「BattleManager」のクラスでカウントしているので、この値が使えます。

 

補助魔法や攻撃魔法

ドラクエでいうバイキルトやスクルトなどの補助魔法、メラやヒャドなどの攻撃魔法についても省略しました。魔法効果のカテゴリとしては用意しているので、データを作成していくことで追加できるかと思います。「BattleActionProcessorMagic」で分岐を追加することでその処理も入れられそうです。

補助魔法の場合は、効果ターン数なども考えておくと良いかと思います。同じ補助魔法をかけたら効果が延長するのか、効果ターン数の値に上書きするのか、それともさらに効果が増えるのか、といった部分はあらかじめ決めておくと戦闘のバランスを取りやすくなります。

攻撃魔法に関しては、威力の計算を行う際に参照するパラメータなども決めておきましょう。今回のチュートリアルではドラクエでいう「かしこさ」のパラメータは導入していませんが、魔法に関連するパラメータがあるとキャラクターごとの特色も出しやすくなります。

 

属性やステータス異常

火属性、氷属性などの属性による相性や、毒や麻痺といったステータス異常についても省略しています。今回は小規模なゲームのため、属性を使うほどのアイテム量や魔法量がないのも理由のひとつです。

また、各属性の相性や、ステータス異常になる確率など、これらが増えると戦闘関連での確認項目が倍増するので、チュートリアルとしては入れていません。とはいえゲームとしてはこうした要素はとても大切で、戦略を考える楽しみも生まれてくることから、実際にゲームを作る際には導入を検討すると良いかと思います。

属性については量が多いとユーザが相性を覚えるのに苦労するため、増やしすぎない方がおすすめです。

ステータス異常の仕組みがあると、消費アイテムで敵をステータス異常にしたり、ステータス異常を防ぐ装備を作ったりと、定義データの効果範囲なども広がっていくため、各定義データがどのように関連するかを見渡せるようにしておくと実装しやすくなります。

 

ターゲット選択の機能

今回は1対1の戦闘で実装するため、ターゲット選択の機能を省略しました。ほとんど戦闘関連で省略を行なっています。

戦闘中のターゲット選択、メニュー画面でのターゲット選択など、チュートリアルのものに1ウィンドウ追加されるイメージです。戦闘に関していえば、味方が敵キャラクターを倒した後、残りの敵キャラクターを攻撃対象にするオートターゲットの機能なども実装しておくと良いかと思います。ここは複数人戦闘の場合に実装を検討すると良いでしょう。

複数人の戦闘では戦略が大きく広がっていきます。誰かが防御している間に回復する、といった行動もできるように、防御コマンドを追加すると良いかと思います。そうすると、戦闘のターン開始時に全体としてのコマンド入力、そこからキャラクターごとのコマンド入力、といったようにフェーズを分けるのもひとつの方法です。

魔法の効果範囲に応じたターゲット選択などもあるため、それぞれ確認項目は大きくなりますが、一度仕組みを作っておけば拡張していくのはそう難しくはないため、次にゲームを作るときにも役に立ちます。

 

完走した感想

(チュートリアルの作成を)完走した感想ですが、思ったより時間がかかって大変でした(小並感)

別の作業と並行して進めていたとはいえ、「もしかしたらUnity6.1が出ちゃうかもしれませんね(そう言いつつその前に終わるでしょ)」なんて思っていたのですが、2025年8月末の時点ではもうUnity6.2まで出ているので、予想より時間がかかってしまいました。

『【Unity】簡単なRPGを作る場合に必要な作業を考えてみよう』のページや『UnityでRPGを作る時にスムーズにいきそうな作業順序を考えてみる』のページでは「小規模にする」と何度も自分に言い聞かせていたはずが、作業量としては多くなって泣きそうになりました。このチュートリアル、ゲームとして遊ぶ部分は5分、10分程度の小規模なものとなっているにもかかわらず、RPGとして動作させるためのシステム面の実装でかなりの時間を割いたので、RPGはやはり土台作りが肝となるのを改めて実感しました。

ただ、RPGを1作しか作らないなら土台作りの相対的な工数は大きくなりますが、この後にいくつかRPGを作っていくのであれば、ベースとなるシステムがもう既にある状態なので、それを改良していくことで相対的な工数は少なくなっていきます。システムの使い回しやさらなる改善は開発の華ですもんね。

このチュートリアルでは最初から全部実装済みだったわけではなく、おおまかな方針は用意しておきつつも、回の進行とともに内容を実装していったため、ライブ感で作っていった部分もあります。必要に応じて過去の回も修正していければと思います。色々リファクタリングしたい部分もありつつ、各回ごとのコードを壊さないようにしないと……というジレンマもあるのでgithubの方はあまりいじりすぎないようにしようかとも思っています。迷いますね。

自分発の企画で、しかもお金をもらってるわけでもない、やりたいからやるというチュートリアルだったので、自分の性格を考えると途中で投げ出したくなりそうな予想もしていたのですが、なんだかんだ最後まで進められたのでよかったです。RPGを作れる人が増えていけば、自分が遊びたくなるRPGが世の中に増えていくことを願ってこのチュートリアルを作りました。

出版社様におかれましては、Unityを使ったRPG作成のガイドブック、チュートリアル本の出版はいかがでしょうか。原稿の素案はもうできているようなものなので、本の方針に従ってリビルドして執筆しますのでぜひ(露骨な宣伝)

 

まとめ

シンプルなRPGを作るチュートリアルはこれにて完結です。

長時間お付き合いいただき、ありがとうございました。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!