どうも、萬朶櫻(@wanduoying)、181朶目の記事です。
前囘、マップを半分ランダムに生成するコードを書きました。

今囘はそのマップ上にキャラクター、アイテム、罠などのオブジェクトを生成しようと思ひます。
マップをいい感じに生成するスクリプトを教へてもらつた
前囘の最後の方で「マップをいい感じにランダム生成する方法が分からん」と書いてゐましたが、そのことをTAにて相談してみたら、MapGenerator.csといふスクリプトを教へてもらひました。
以下の4行目でインスタンス化して利用してゐます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void MapGenerator() { //2次元の配列にする MapGenerator mapGen = new MapGenerator(); //0が壁、1が通路、2が部屋のint型二次元配列 int[,] map = mapGen.GenerateMap(mapWidth, mapHeight, maxRoom); //各インデックスに代入された値を基に、壁などの生成、不生成を判別 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { //インデックスの値が0の時、wallPrefabを生成 if (map[i, j] == 0) { GameObject go = Instantiate(wallPrefab); go.transform.position = new Vector3(i, 0, j); } //インデックスの値が1、2の時、floorPrefabを生成 if (map[i, j] == 1 || map[i, j] == 2) { GameObject go = Instantiate(floorPrefab); go.transform.position = new Vector3(i, -0.5f, j); } } } } |
ただ、MapGenerator.csの中身は難し過ぎてサッパリ分かりませんでした。
理解できないとアレンジとか出來ないので、頑張つて勉強しないとね。
なほMapGenerator.csは自分で書いたものではない貰ひ物なので、公開はやめておきます。
マップ上の座標にランダムで敵を生成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DungeonGenerator : MonoBehaviour { //オブジェクトを宣言 public GameObject floorPrefab; //床 public GameObject wallPrefab; //壁 public GameObject PlayerPrefab;//プレイヤー public GameObject EnemyPrefab;//敵 //ランダム値 private int randomMin = 0; private int randomMax = 100; //マップ public int mapWidth = 100; public int mapHeight = 100; public int maxRoom = 10; void Start() { MapGenerator(); CharacterGenerator(); } //マップ作成 void MapGenerator() { //~~~省略、上見出し參照~~~ } //プレイヤーと敵作成 void CharacterGenerator() { //2次元の配列にする int[,] map = new int[mapWidth, mapHeight]; //for文を用ゐて各インデックスに1もしくは0を代入 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { map[i, j] = Random.Range(randomMin, randomMax); } } //各インデックスに代入された値を基に、壁などの生成、不生成を判別 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { //インデックスの値が規定値以下の時、EnemyPrefabを生成 if (2<=map[i, j] && map[i, j] < 4) { GameObject enem = Instantiate(EnemyPrefab); enem.transform.position = new Vector3(i, 0, j); } } } //PlayerPrefabを生成 GameObject go = Instantiate(PlayerPrefab); go.transform.position = new Vector3(0, 0, 0); } } |
MapGeneratorとCharacterGeneratorの中で同じ二次元配列のmap[,]が使はれてゐますが、それぞれ別の獨立したローカル變數です。
この2つのmap[,]をレイヤーみたいにして重ねてゐるわけです。
實行してみます。
なんか壁の中に敵が生成されてますが、とりあへずはできました。
同じやうにプレイヤー、アイテム、罠を生成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void CharacterGenerator() { //2次元の配列にする int[,] map = new int[mapWidth, mapHeight]; //for文を用ゐて各インデックスに1もしくは0を代入 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { map[i, j] = Random.Range(randomMin, randomMax); } } //各インデックスに代入された値を基に、壁などの生成、不生成を判別 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { //インデックスの値が規定値以下の時、PlayerPrefabを生成 if (map[i, j] < 2) { GameObject go = Instantiate(PlayerPrefab); go.transform.position = new Vector3(i, 0, j); } //インデックスの値が規定値以下の時、EnemyPrefabを生成 if (2<=map[i, j] && map[i, j] < 4) { GameObject enem = Instantiate(EnemyPrefab); enem.transform.position = new Vector3(i, 0, j); } } } } |
ただ、これだとプレイヤーキャラが複數生成されたり、あるいは1つも生成されない可能性があり、ちよつと工夫が必要ですね。
續いてアイテムを生成するための函數void ItemGenerator()、それと罠や階段などの地面設置物を生成するための函數void GroundObjectGenerator()を書き加へます。
これもvoid CharacterGenerator()と同じやうにローカル變數map[i, j]を作成し、亂數に應じて處理します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void ItemGenerator() { //2次元の配列にする int[,] map = new int[mapWidth, mapHeight]; //for文を用ゐて各インデックスに1もしくは0を代入 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { map[i, j] = Random.Range(randomMin, randomMax); } } //各インデックスに代入された値を基に、壁などの生成、不生成を判別 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { //インデックスの値が規定値以下の時、ItemPrefabを生成 if (map[i, j] < 2) { GameObject go = Instantiate(ItemPrefab); go.transform.position = new Vector3(i, 0, j); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void GroundObjectGenerator() { //2次元の配列にする int[,] map = new int[mapWidth, mapHeight]; //for文を用ゐて各インデックスに1もしくは0を代入 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { map[i, j] = Random.Range(randomMin, randomMax); } } //各インデックスに代入された値を基に、壁などの生成、不生成を判別 for (int i = 0; i < map.GetLength(0); i++) { for (int j = 0; j < map.GetLength(1); j++) { //インデックスの値が規定値以下の時、TrapPrefabを生成 if (map[i, j] < 2) { GameObject go = Instantiate(TrapPrefab); go.transform.position = new Vector3(i, 0, j); } } } } |
ちやんとアイテム、罠、プレイヤーキャラが生成されました。
假とは云へ、プレイヤーキャラとそれ以外とのグラフィック格差が大きすぎる。
次囘は
- プレイヤーを1人だけ生成するやうにする
- キャラクターが壁の中に生成されないやうにする
このあたりを進めていかうと思ひます。
コメントを残す