Procedural Dungeon Generatorでお手軽にダンジョンつくろ〜

ayumegu(プログラマー)
よろしくお願いします。

今回もアセット紹介
今回は現在Madnessセール中のProcedural Dungeon Generator

なにができるかというとダンジョン生成とか、マップとかつくれます。
パターンも何種類もあるので見ているだけでわくわくします。
デモのサンプルで作ったマップをいくつか

部屋のサイズや数、ドアの数など多少パラメータで変更できます。
あとはデータから2Dなり3Dなり好きに配置すればOK

3Dのデモ
  

2Dのデモ

とりあえずダンジョンを作ってみる

かるい紹介はここまでで早速ダンジョンをつくってみることに
2Dにしようと思うので前回記事で紹介したRpgMapEditorを表示周りは使用します
こんな感じのものを作るならソースは下記1ファイルで完了

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
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using ProD;
using CreativeSpore.RpgMapEditor;

public class Test : MonoBehaviour {

  public WorldMap worldMap;
  public AutoTileMap autoTileMap;
  
  void Start () {
      Generator_Dungeon.SetGenericProperties(49,49, "");
      Map tempMap = Generator_Dungeon.Generate();
      for(int y = 0; y < 49; y++)
      {
          for(int x = 0; x < 49 ; x++)
          {
              autoTileMap.SetAutoTile(x, y, -1, (int)AutoTileMap.eTileLayer.GROUND);
              autoTileMap.SetAutoTile(x, y, -1, (int)AutoTileMap.eTileLayer.GROUND_OVERLAY);

              Cell cell = tempMap.GetCell(x, y);
              if(cell.type == "Wall")
              {
                  autoTileMap.SetAutoTile(x, y, 17, (int)AutoTileMap.eTileLayer.GROUND);
              }
              else if(cell.type == "Abyss")
              {
                  autoTileMap.SetAutoTile(x, y, 0, (int)AutoTileMap.eTileLayer.GROUND);
              }
              else if(cell.type == "Path")
              {
                  autoTileMap.SetAutoTile(x, y, 16, (int)AutoTileMap.eTileLayer.GROUND);
              }
              else
              {
                  autoTileMap.SetAutoTile(x, y, 16, (int)AutoTileMap.eTileLayer.GROUND);
              }

              if(cell.type == "Exit")
              {
                  autoTileMap.SetAutoTile(x, y, 1032, (int)AutoTileMap.eTileLayer.GROUND_OVERLAY);
              }
              else if(cell.type == "Entrance")
              {
                  autoTileMap.SetAutoTile(x, y, 1033, (int)AutoTileMap.eTileLayer.GROUND_OVERLAY);
              }
          }
      }
  }
}

注意はマップの縦、横は奇数ではないとだめです。
cell.typeは

  • Wall:壁
  • Abyss:通路と接していない壁っていうのかな
  • Path:道
  • Door:扉
  • Entrance:入り口
  • Exit:出口

です。

ダンジョンの細かいパラメータを変更したいときは

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   private static int room_Min_X = 3;
  private static int room_Max_X = 11;
  private static int room_Min_Y = 3;
  private static int room_Max_Y = 11;
  private static int room_Freq = 10;
  private static int room_Retry = 6;
  private static int doorsPerRoom = 2;
  private static int repeat = 12;
  private static bool frameMap = false;
  
  void Start () {
      Generator_Dungeon.SetGenericProperties(49,49, "");
      Generator_Dungeon.SetSpecificProperties("Abyss", "Path", "Wall", room_Min_X, room_Max_X, room_Min_Y, room_Max_Y, room_Freq, room_Retry, doorsPerRoom, repeat, frameMap);
      Map tempMap = Generator_Dungeon.Generate();
      
      // マップ表示処理
  }

こんな風にGenerator_Dungeon.SetSpecificPropertiesメソッドにパラメータを渡してあげると変更できます
試しにドアの数を2にしてみたところ

あとはRpgMapEditorの記事のときに紹介した通りPlayerを配置したりすればこの通り
簡単につくったもの

感想

マップチップでやるならProcedural Dungeon GeneratorとRpgMapEditorがあればあっという間にダンジョンゲームはできてしまいそうです。
経路探索も入っているのでターンベースにしたり、わくわくですね〜。
もう1からダンジョン生成アルゴリズムをくむ必要がないという、素敵な時代になりました。