この講座ではUnityとC#を使って不思議のダンジョン系ローグライクゲームを制作していきます。
第一回目の今回はプロジェクト立ち上げからスタートしてローグライクRPGに必要なマップデータを作成し、自動でマップを生成するところまで実装していきましょう!
ローグライクゲームのUnityプロジェクト作成
まずはUnityプロジェクトを作成します。
テンプレートを3Dに選択してプロジェクト名を「Roguelike」などお好きな名前で作成してください。
ローグライクゲームに必須のダンジョンマップの作り方
プロジェクトを作成したら早速マップを作っていきましょう。
この講座ではマップをよくある2Dマップとみなして作成していきます。3Dシーンを使うものの、高さ方向がないマップを作るということですね。
まず、マップをどうプログラムで表現するか決めてから、シーンやプレハブを作成していきます。
プログラム上のマップの表現方法を考えてみよう
2Dマップはたくさんのマスを使って表現します。1マスは基本的に上下左右の別のマスに隣接しています。
隣接しているマス同士をプレイヤーは移動することができますが、壁だった場合は移動できないようにします。
これらの情報をこの講座では編集しやすくするためにテキスト情報として、ソースコード上に埋め込みます。
※Editor拡張を使用するとScriptableObjectとしてInspectorから編集することもできますが、簡略化のためソースコードに直接書き込んでいます。
例として、次のような文字列型をスクリプトのどこかに書いておきます。
1 2 3 4 5 6 7 8 9 10 11 |
//マップデータ // 0: 道 // +: 壁 // S:開始位置 // G:ゴールの位置 string map = “000P\n” + “0+++\n” + “0000\n” + “+++0\n” + “G000”; |
上のマップデータではマップはアナログ数字の5の形をした道になっています。0を辿ると数字の5になりますね。
- 「0」は道になる
- 「+」は壁になる
- プレイヤーの開始位置は「P」の位置になる
- ゴールの位置は「G」の位置になる
この記事では道と壁、ゴールを先に作っていきます。
プレイヤー処理は次の記事で実装していくので楽しみにしていてください。
マップに必要なシーンやアセットを作成していく
マップは専用のシーンで管理していきます。デフォルトで作成されているシーンを「MapScene」という名前に変更してください。
シーンの名前を変更したら、先にマップ作成に使うプレハブを用意します。
ローグライクゲームのマップ用の道プレハブと壁プレハブの作成
次の二つのプレハブを作成します。
- RoadPrefab:道を表すプレハブ
- WallPrefab:壁を表すプレハブ
道を表すプレハブの作成
まず、道を表すプレハブを作成します。次の手順を行ってください。
- メニューから空のGameObjectを作成し、名前を「RoadPrefab」にしてください。
- メニューのGameObject > 3DObject > Cubeをクリックし、GameObjectを作成してください。名前は「Model」にしてください。
- 作成した「Model」は「RoadPrefab」の子GameObjectにしてください。
- 「Model」は平べったい床になるように調節してください。
- ※お好みで好きなマテリアルを設定するのもいいでしょう。
(「Model」は表示するモデルの位置調節に使用します。)
ここまでできたら、シーンの上の「RoadPrefab」をプレハブ化してください。シーン上の「RoadPrefab」は削除してください。
「RoadPrefab」のサイズは好きなものでOKですが、その際必ずXとZの長さは同じになるようにしてください。後ほど作成するスクリプトではXとZのサイズ感が同じものととして扱っていきます。
壁を表すプレハブの作成
次に壁を表すプレハブを作成します。次の手順を行ってください。
- メニューから空のGameObjectを作成し、名前を「WallPrefab」にしてください。
- メニューのGameObject > 3DObject > Cubeをクリックし、GameObjectを作成してください。名前は「Model」にしてください。
- 作成した「Model」は「WallPrefab」の子GameObjectにしてください。
- 「Model」のサイズはデフォルトのものでOKです。
- ※お好みで好きなマテリアルを設定するのもいいでしょう。
ここまでできたら、シーンの上の「WallPrefab」をプレハブ化してください。シーン上の「WallPrefab」は削除してください。
「WallPrefab」も「RoadPrefab」と同じく必ずXとZのサイズが同じになるようにしてください。
Y成分はお好みでいいです。この記事ではスケールのYを1に設定しています。
次の階へ進むゴール(階段)を表すプレハブの作成
次に淘汰すると次の階へ進むゴールを表すプレハブを作成します。次の手順を行ってください。
- メニューから空のGameObjectを作成し、名前を「GoalPrefab」にしてください。
- メニューのGameObject > 3DObject > Cubeをクリックし、GameObjectを作成してください。名前は「Model」にしてください。
- 作成した「Model」は「GoalPrefab」の子GameObjectにしてください。
- 「Model」は平べったい床になるように調節してください。
- ※お好みで好きなマテリアルを設定するのもいいでしょう。
ここまでできたら、シーンの上の「GoalPrefab」をプレハブ化してください。シーン上の「GoalPrefab」は削除してください。
「GoalPrefab」も「RoadPrefab」と同じく必ずXとZのサイズが同じになるようにしてください。
Y成分はお好みでいいです。この記事ではスケールのYを1に設定しています。
再生したらダンジョンマップが生成されるC#スクリプトを書こう
マップに必要な素材が作成できたので、次は再生したらマップをシーンに自動配置するようにスクリプトを作成していきましょう。
マップの作成は「Map」スクリプトで行います。新しくスクリプトを作成し、内容を次のものにしてください。
まとめ
今回の記事ではローグライクゲームを構成する必須要素であるマップを作成していきました。
マップのデータ構造の説明のためマップデータはスクリプトに直接埋め込みましたが、後々自動生成するように拡張します。
今回の記事をまとめると次のようになります。
- ゲームのメイン画面となる「MapScene」シーンを作成
- マップのマスを表すプレハブを作成(道と壁と次の階へ進むゴール)
- マップを生成するためのスクリプトとコンポーネントの作成(Map.cs)
- 再生時に予め用意したデータからマップを自動的に作成する処理の実装(MapSceneManagerコンポーネント)
また本講座では、使っていくプレハブや自作したアセットは断りなく種類別にフォルダー分けして保存しています。
今後アセットを追加していく際はアセットの種類ごとのフォルダーに保存して使っていくのでご注意ください。
フォルダーの名前は自由ですが、次のようにしています。
- プレハブ:Prefabsフォルダーに保存
- スクリプト:Scriptsフォルダーに保存
- シーン:Scenesフォルダーに保存
- マテリアル:Materialフォルダーに保存
などなど(必ずフォルダー分けする必要はありませんので、この辺りはお好みでOKです。)
それでは次の記事に行ってみましょう。
次の記事:
コメント
どうもこんにちは。タワーディフェンスの講義ではコメント頂いてありがとうございました。
現在引き続き新たにこちらの講義にチャレンジしています。
このページの講義を一通り手順通り進めさせて頂いたのですが,
どうもそのまま進めるとエラーが出てしまいます。
[再生したらダンジョンマップが生成されるC#スクリプトを書こう]にて,
Mapスクリプトを作成した段階で下記エラーが発生しました。(コードのコピペでも同様のエラーを確認)
バージョン : 2019.4.34f1
[エラー内容]
Assets\Scripts\Map.cs(121,20): error CS0111: Type ‘Map’ already defines a member called ‘CalcMapPos’ with the same parameter types
内容から”CalcMapPos”の定義がMapスクリプト内で重複しているという事だったので,
121行目の
public Vector3 CalcMapPos(int x, int y) { var pos = Vector3.zero; pos.x (省略
の一行を丸々削除orコメントアウトしたところ,
エラーが出なくなり再生結果も掲載されてる画像と同じ様に見受けられたので,
一応そのまましていますが, エラーの発生がアタッチミスなどによるものなのか自分では判断がつかなかったため今回メッセージを送らせて頂きました。
ご確認・返信など頂ければ幸いです。
コメントありがとうございます!
同じ文章が二度書かれている状態になってましたね。完全にタイプミスですね。すみません汗
同じ関数なので二回目の宣言は不要です!
こちら削除修正しておきました。
ご報告いただきありがとうございました!