【Unity】RPGを作るチュートリアルその63 マップを制御するクラスを作成

【Unity】RPGを作るチュートリアルその63 マップを制御するクラスを作成

シンプルなRPGをUnityで作るチュートリアルシリーズの63回目です。

第62回ではエンカウントの動作を管理するクラスを作成しました。

今回はマップの管理の仕組みを考えつつ、マップを制御するクラスから作成していきます。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

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

 

チュートリアルの一覧

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

 

前回の内容

前回はエンカウントの動作を管理するクラスを作成しました。

 

マップの管理について

RPGでは今どの場所にいるのか、この場所からどの場所に移動できるのか、といった部分を管理しておくと制御がしやすくなります。村、フィールド、洞窟など、いる場所の単位はマップや、レベルという呼ばれ方をしますが、今回のチュートリアルではマップと呼びたいと思います。

現在の状態だと、マップは以下のように「Grid」の下にタイルマップを配置する形になっています。タイルマップはレイヤーに分かれていて、このレイヤー構成は他のマップでも共通して使いたいと思います。

現在のマップの構成
現在のマップの構成

 

村、フィールド、洞窟といった区切りでタイルを配置してマップを作成したいので、以下の画像のようにマップの単位で親オブジェクトを作成して管理します。この親オブジェクトにマップ管理用のスクリプトをアタッチして、マップの情報を持たせるようにしたいと思います。また、この親オブジェクトの単位でPrefabを作成して、Addressablesでロードできるようにします。

マップの親オブジェクトを作成する
マップの親オブジェクトを作成する

 

個別のマップに関してはそのマップを管理するクラスを用意して、シーン内ではマップの読み込みや切り替えを行います。今回はマップの制御クラスを作成していきます。

 

マップの制御クラスの作成

個別のマップを制御するクラスを作成します。必要な機能としては、

  • マップIDを保持するフィールド
  • マップ名を保持するフィールド
  • エンカウント定義を保持するフィールド
  • EncounterManagerにエンカウント定義を渡すメソッド

です。

Projectウィンドウから「Assets/Scripts/Map」のフォルダに移動し、MonoBehaviourのスクリプトファイルを作成します。名前は [MapController] にしました。

スクリプトファイルの作成
スクリプトファイルの作成

 

作成した「MapController」の中身は以下のように記載しました。

マップID、マップ名、エンカウント定義データをそれぞれInspectorウィンドウから設定できるようにします。

また、エンカウント定義データに関しては、エンカウント管理のクラスに通知するためのメソッドを用意します。このメソッドはマップを表示する際に呼び出す想定です。

 

スクリプトのアタッチ

スクリプトを保存したら、ゲームオブジェクトの作成してスクリプトをアタッチしましょう。

 

MapControllerのアタッチ

Hierarchyウィンドウから、「Grid」のゲームオブジェクトの下に空のゲームオブジェクトを作成します。名前は [TestMap] にしました。

マップの親オブジェクトを作成する
マップの親オブジェクトを作成する

 

作成した「TestMap」を選択し、Inspectorウィンドウから「MapController」のスクリプトをアタッチします。「Map Id」の項目は [0] に、「Map Name」の項目は [テストマップ] に、「Map Id」の項目は [EncounterData_Field] をアサインします。

スクリプトのアタッチ
スクリプトのアタッチ

 

マップのPrefab化

続いてマップの親オブジェクトをPrefabにします。PrefabはAddressablesでロードできるようにして、読み込むマップIDに対応したPrefabをインスタンス化、あるいはインスタンス化済みなら表示の切り替えができるようにします。

Projectウィンドウから「Assets/Prefabs」のフォルダを開き、新しくフォルダを作成します。名前は [Map] にしました。

マップ用フォルダの作成
マップ用フォルダの作成

 

作成した「Map」フォルダを開き、Hierarchyウィンドウから「TestMap」のゲームオブジェクトをドラッグ&ドロップしてPrefabを作成します。機械的にロードできるように、名前は [Map_0000_TestMap] にしました。「Map_」の部分が接頭辞で、「0000」の部分はマップIDを4桁で表したもの、その後ろは人が分かるようにマップの説明にしています。ロードしたPrefabを特定する際に、IDを4桁表記に直して文字列の先頭一致を使う予定です。

テスト用マップのPrefab
テスト用マップのPrefab

 

Addressablesのグループ追加

作成したPrefabをAddressablesに登録するところまでやっちゃいましょう。「Addressables Groups」のウィンドウを開き、コンテキストメニューから [Create New Group] -> [Packed Assets] を選択して新しくグループを作成します。名前は [Map] にしました。

グループの追加
グループの追加

 

作成したグループに、先ほど作成した「Map_0000_TestMap」のPrefabをドラッグ&ドロップして追加します。コンテキストメニューから [Simplify Addressable Names] を選択して名前を短くしておきます。

アセットの登録
アセットの登録

 

マップ用のラベルを追加したいので、ラベルのプルダウンをクリックして、メニューから [Manage Labels…] を選択します。

ラベルを追加する
ラベルを追加する

 

ラベルの管理ウィンドウでは、新しく [Map] のラベルを追加します。

Mapのラベルを追加
Mapのラベルを追加

 

ラベルの管理ウィンドウを閉じたら、プルダウンから先ほど追加した「Map」のラベルを選択します。

ラベルの選択
ラベルの選択

 

マップ関係のPrefabに関してはこのグループに追加していきます。

 

ラベルの定数クラスを変更

スクリプト内からラベル名を参照するため、既存のラベルの定数クラスである「AddressablesLabels」を変更していきます。

既存の「Magic」のフィールドの下に「Map」のフィールドを追加します。

動作確認については、マップの管理を行うクラスができてからやっていくので、今回はここまでで完了です。

 

今回のブランチ

 

まとめ

今回はマップの管理の仕組みを考えつつ、マップを制御するクラスから作成しました。また、マップ用ゲームオブジェクトのPrefabを管理するために、Addressablesのグループやラベルについても設定を行いました。

次回はマップの管理クラスを作成して、エンカウントの動作を確認していきましょう。

 

     

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

CTA-IMAGE

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


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


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