【Unity】3DダンジョンRPGの作り方 第17回|マップギミック・イベントシステムの実装 | Unity入門の森 ゲームの作り方

【Unity】3DダンジョンRPGの作り方 第17回|マップギミック・イベントシステムの実装

Unity 3DダンジョンRPGの作り方 ~世界樹・ウィザードリィ風ゲームを作ろう~

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この記事はUnityを用いた3DダンジョンRPG作り方講座の17回目になります。

前回はアイテム図鑑・モンスター図鑑を実装し、ゲーム内でのやりこみ要素やコレクション要素を追加しました。RPGに限らず様々なゲーム開発に応用できるスキルです。

前回の記事:

Unity 3DダンジョンRPGの作り方16 アイテム図鑑とモンスター図鑑を実装する
この記事はUnityで作る3DダンジョンRPGの作り方講座の第16回目です。前回は、ダメージ計算処理に装備品の効果を取り込み、さらに素材を使ってアイテムショップに装備品が並ぶ合成システムや武器、防具、道具の売買を含むアイテムショップの作り方...

今回はダンジョンマップ内に配置するイベントを実装し、階層の進行やアイテム獲得などを特定の場所で起こせるようにします。

具体的には、出入り口、階段、宝箱、アイテムドロップ、シンボルエンカウント敵(FOE)、扉、鍵付き扉、テレポート床、矢印の方向に移動させる床、ダメージ床などです。

ウィザードリィや世界樹の迷宮といった3DダンジョンRPGにおなじみのマップギミックの作り方を習得していきます。

【ゲームの作り方講座プレゼント中!】

ダンジョンイベント(Entity)を実装する

これまでダンジョン設計で扱っていたマップエディタでは地形情報(地面か壁か)しか設定することが出来ませんでした。

これを機能拡張し、特定のマスにおいて指定したイベントを発生させられるようにしていきます。

この記事では今後、ダンジョンで発生するイベント(およびそこから生成される実体)をEntityと呼称していきます。

Entityの種類

サンプルゲームでは以下の11種類を用意しています。

定義名 名称 説明
ExitPoint ダンジョン出口 重なることで街シーンへと遷移する
Up_Stairs 昇り階段 1つ上の階層へ移動してシーンを再読み込みする
Down_Stairs 降り階段 1つ下の階層へ移動してシーンを再読み込みする
Treasure 宝箱 指定したアイテムを獲得する
1度起動したらこのEntityは消滅し、ダンジョンに入りなおしても復活しない
Gathering 採集ポイント 指定したアイテムを獲得する
1度起動したらこのEntityは消滅するが、ダンジョンに入りなおせば復活する
FOE FOE マップ内を徘徊するシンボルエネミー
振れることで指定したエネミー編成との戦闘を開始する
Locked_Door 鍵穴つき扉 通行不可能な壁
“扉の鍵”を取得で消滅し、ダンジョンに入りなおしても復活しない
KeyofDoor 扉の鍵 重なることで取得して消滅し、ダンジョンに入りなおしても復活しない
Conveyor 強制移動床 指定した方向にプレイヤーを強制移動させる
WarpPoint ワープポイント 指定した地点・方向にプレイヤーをワープさせる
Spikes ダメージ床 重なることで編成中のアクター全員がダメージを受ける

Entityクラス作成

マップエディタ内でEntityを扱うときはMapEntityクラス、実際にダンジョンシーン内で動作させるときはDungeonEntityという名前でそれぞれクラスを用意します。

併せてMapDataSOクラスが扱える情報の種類を拡張します。

MapDataSO.cs

多数のpublic変数を追加しました。これは主にマップエディタで入力するものになります。
内容についてはMapEditorクラス拡張時に触れていきます。

採集ポイントおよび宝箱から獲得できるアイテムのデータはGatheringPointクラスが保持します。

EnemyTableクラスは出現するエネミーの編成(組み合わせ)を設定できるものです。

DungeonEntity.cs (新規)

ダンジョンシーン内で各Entityのプレハブにアタッチしておくクラスになります。現在位置の情報を持ちます。(移動するEntityが現在位置情報を使用)

UnityでMapEditorを拡張する

MapEditorWindow.cs

タイルを描画するモードとEntityを配置するモードを自由に切り替えられるようにしました。

またマップ名や出現するエネミーレベル、採集ポイントから獲得できるアイテムの種類や個数など細かく設定できるGUIを追加しています。

テスト用マップ作成

画面上部メニューのWindow > MapEditor画面を開き、従来と同じようにMapDataのScriptableObjectをセットして編集を開始します。複数のボタンや入力ボックス等が追加されているのが確認できるはずです。

上部UIにある[Map Name]にはマップ名、[Enemy Level]には出現するエネミーのレベルを入力します。

[Enter Location]は、ダンジョンへの突入時のそのマップ内での初期位置を入力します。
一番左上のマスが(0, 0)であり、1つ右へ行けばxが+1し、1つ下へ行けばyが+1します。

[Enter Direction]は同様に初期に向いている方向を設定します。

 

その下に2つ並んでいるボタンのうち右側、[Entity配置]をクリックすればEntityを配置するモードに切り替わります。

[Entity Type]はエディタ画面クリックでその場所に配置するEntityの種類を選択します。(None選択時には何も起こりません。)

 

[Entity名][EntityID]には各Entityの設定を入力しますが、これらの動作はあとで実装するため現在は両方とも空欄でOKです。

また画面下部にある[Gathering Points]なども現在は未設定のままで良いです。

 

ひとまずはEntityの配置とダンジョン画面での表示を確認したいため、全11種類あるEntityをそれぞれマップ内の適当な場所に配置してみましょう。

Entity Typeの選択→タイルクリックの流れでペイントできます。

既にEntityが配置されているマスをクリックするとエディタ画面下部に選択中のオブジェクト情報が表示されます。

ここからEntity名やEntityIDの確認と編集ができるほか、Entityの削除ボタンもあるので誤って配置したものはここから削除しましょう。

Unityでダンジョンギミック用3Dオブジェクトを作る

これでマップデータがEntityの配置情報を保持できるようになりました。次はゲーム中にこれらのEntityがオブジェクトとなって画面内に表示されるのを確認できるところまで進めましょう。

ダンジョン画面は3Dオブジェクトによって構成されているので、各Entityオブジェクト(プレハブ)も3D立体で作成します。

 

Dungeonシーン内にEntityオブジェクトの親となる空オブジェクト(Entities)を適当に用意し、その下にプレハブを作成していきましょう。

各ダンジョンギミックのEntityプレハブを作成

各オブジェクトはDungeonEntityコンポーネントさえアタッチされていれば使用できるようになっています。必要なギミックのEntityは好きなように自作しても構いません。以下は各Entity種類に応じた作成方法のサンプルです。

ExitPoint (ダンジョン出口)

Entities以下に[3D Object]→[Cube]を選択して立方体のオブジェクトを作成します。

名前をExitPointに変更し、Y以外のScaleを減らして縦に細長い形状にします。

続けてマテリアルを適用します。素材は Textures/DungeonEntity/EntityMaterials 以下にあります。ヒエラルキーのExitPointオブジェクトにExitPointMatをドラッグ&ドロップします。

↑上図のようにMaterialが変更されていればOKです。

今回は他のパラメータをいじる必要がないため、先ほどC#で作成したDungeonEntityをアタッチします。

最後にこれをプレハブ化し、シーン内からは削除します。(以降もプレハブ化については同じ流れです。)

↑サンプルではPrefabs/Dungeon/Entityというフォルダを作成して格納しています。

Up_Stairs (昇り階段)

Cylinderオブジェクトとして作成します。
Yスケールは0.5くらいが良いでしょう。
本体のMaterialはOthersMatを使用します。DungeonEntity.csのアタッチも忘れずに。

これだけでは見た目が分かりづらいので、パーティクルによる演出を追加します。

子オブジェクトを作成しますが、このとき[Effects]から[Particle System]を選択します。これがUnityにおける標準的なパーティクル演出の機能になります。

パーティクルの解説は本ゲーム開発の本筋ではないため割愛しますが、以下のように設定することで「上方向に矢印が出現し続ける」パーティクルを作成できます。

Main Module

Emission / Shape

Color over Lifetime

↑右上の黒い矢印をクリックしてAlphaの値を0にします。パーティクルの寿命が尽きる際に透明になります。

Renderer

StairsArrpwMatを用いることで矢印が上に移動するようになります。

この設定によって以下のようなパーティクル表示を確認できるはずです。

 

また、この演出をさらに強化するため、追加でUp_Stairsオブジェクト以下にMagicCircleという名前の([3D Object]の)[Quad]を作成します。

RectTransformを以下のような値にし、MaterialにMagicCircleを指定します。すると円柱の底面付近に魔法陣が表示されるようになります。

さらにゲーム中はこの魔法陣を一定の速度で回転させ続けるように、以下のスクリプト(RotateContinuous.cs)を作成してアタッチします。

RotateContinuous.cs

これがアタッチされたオブジェクトはゲーム中、常に指定された回転軸に沿って一定速度で回転を続けます。

MagicCircleにアタッチすれば設定完了です。

そしてUp_Stairsオブジェクトをプレハブ化しますが、すぐにはシーン内からは削除せずに一度Unpackしてプレハブとの紐づけを解除して残します。

Up_Stairsオブジェクトを選択して右クリック→Prefab > Unpackで解除されます。

Down_Stairs (降り階段)

Up_Stairsオブジェクトを改変する形で降り階段の方も用意していきます。まずはオブジェクト名を変更します。

Particle Systemの設定も矢印が下向きに動くように変更します。といってもオブジェクト自体の向きとパーティクルの向きを180度変更するだけでOKです。分かりやすいように色も変えておきましょう。

MagicCircleの回転速度も逆向きに設定する(速度をマイナスにする)ことでより視覚的に分かりやすくなります。

これをプレハブ化で3つ目が完了です。

Treasure (宝箱)

Cubeオブジェクトを作成し、Rect Transformの調整・Materialの適用(TreasureMat)・Dungeon Entityのアタッチを行います。

そしてこのオブジェクトはゲーム中、常に回転しながらその場で上下移動を繰り返すように演出します。

回転スクリプトは作成したので、今回作成するクラスはYFloatingContinuous.csです。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

まとめ

これでダンジョン内で発生する様々なイベントをマップエディタを使って3Dダンジョン上で表現できるようになりました。

アイテムの収集や強敵との戦闘、トラップ、ギミックなど様々な障害がプレイヤーを阻むダンジョンを自由に作れるようになり、次の階層への進行を楽しめるようになりました。

新しいイベントの内容を思いついたらぜひオリジナルなEntityを実装してみましょう。

 

次の記事:

【Unity】3DダンジョンRPGの作り方 第18回|戦闘システム完成・セーブ&ロード実装
この講座は世界樹の迷宮やウィザードリィのような3DダンジョンRPGの作り方について説明しています。今回はその第18回目になります。前回はダンジョン内のイベントをEntityという形で実装し、ダンジョン探索のシステムを一通り用意しました。前回...

Unity 3DダンジョンRPGの作り方講座に戻る >>

 

【ゲームの作り方講座もプレゼント中!】

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

タイトルとURLをコピーしました