Unityでローグライクなゲームを作ってみる(1) マスタデータの準備編

# はじめに
ローグライクなゲームを作ってみよう！ということで、実際に制作しながら手順を書かせていただきました。
ゲーム制作を行う学生や初心者向けになればいいなと思います。


# 使用するもの
- Unity
 - バージョンは5.5.2f1です
 - ※後ほどプラグインとして「[MiniJSON](https://gist.github.com/darktable/1411710)」を使用します
- 使用する言語はC#
- Excel


# ポイント
- マスタデータ（パラメータ）をエクセル管理
 - バランス調整を容易に
  - ソースコードに直書きはNG！

- ダンジョンを自動生成
 - 所謂、不思議のダンジョンっぽくしてみます

- なるべくお手軽に作る
 - モチベーション大事！


# ダンジョンの仕様
ざっくり下記のように作ります。

1. 1つのダンジョンには各階層となるフロアが存在する
2. 各フロアにはいくつもの部屋が存在する
3. 各部屋は通路で繋がっている
4. これらはマスタデータとしてエクセルで管理
5. 部屋は四角形で固定（余力があればパターン化できるとGOOD）

![_floor.png](https://qiita-image-store.s3.amazonaws.com/0/177910/eb5dc5e7-5604-388f-b390-2d211171effd.png)
後ほど部屋の大きさや通路の長さを調整できるようにします。


# はじめに
今回パート1ということで、まずはマスタデータの準備から。
ダンジョンの生成や、アイテムのデータはエクセルで管理することにします。
エクセルで作成したデータはJSON形式のデータにコンバートし、Unityで扱うことにします。


# マスタデータ用ファイル（エクセル）の準備
ひとまず必要そうなデータとしては、、、

1. ダンジョンのデータ
2. ダンジョンの階層データ

このあたりでしょうか。
1では「最初のダンジョン」「封印されたダンジョン」など、ダンジョンごとのデータを管理します。
2では各ダンジョンの階層データを管理します。1Fは部屋数が5つあって…などです。

上記を、Dungeon.xlsm と DungeonFloor.xlsm として作成しました。
（xlsmで作成し、あとで出力をマクロ化します）


# カラムの用意
ワークシートを作成したら、カラムの準備を行います。
フロアはmin～maxまでのランダムな値で生成します。
小さな部屋もあれば、大きな部屋もあるといった感じですね。

**Dungeon.xlsm**
id:
固有な数値として扱います。
1ダンジョンに1つのIDが存在します。

name:
ダンジョン名です。
「最初のダンジョン」など。適当につけましょう。


**DungeonFloor.xlsm**
後で使う想定で色々用意しておきます。

id:
固有な数値として扱います。
1フロアに1つのIDが存在します。

dungeon_id:
このフロアを関連付けるダンジョンのIDです。
3層構成のダンジョンの例は下記のような感じです。

```
>Dungeon.xlsm
id: 1000, name: 最初のダンジョン

>DungeonFloor.xlsm
id 1, dungeon_id : 1000
id 2, dungeon_id : 1000
id 3, dungeon_id : 1000
```

name:
フロア名です。「～1層」など。

room_width_min / room_width_max:
1部屋あたりの幅です。X軸方向の壁になります。

room_height_min / room_height_max:
1部屋あたりの高さ（奥行き）です。

room_count_min / room_count_max:
1フロア中に存在する部屋の個数です。

room_distance_min / room_distance_max:
部屋と部屋との距離です。
この距離が大きいと通路が長くなる可能性があります。

とりあえずこのような感じで用意しました。

![rogue_excel_sample.png](https://qiita-image-store.s3.amazonaws.com/0/177910/ba953215-ff3d-993c-6fed-91ebc6815f59.png)


# 変換マクロを作成
エクセルのマクロでJSONのフォーマットに変換します。
（ツールを使って直接変換したり、CSV形式から変換したりでも問題ないと思います）
記事の一番最後にVBAでサクっと作ったものを記載しておきます。

作成したデータはこんな感じです。

![json_memopad.png](https://qiita-image-store.s3.amazonaws.com/0/177910/025582b6-fc5a-15a1-a889-e6426ddda47c.png)


# 完成
データの準備が整いました。
次回パート2の記事にてデータの読み込み部分を作成していきます（予定）。
お疲れ様でした！


# サンプルコード
VBAで作成した、JSONフォーマットへの変換マクロです。

```vbnet
:Example
'
' ConvJSON Macro
' JSON形式に変換します。
'
'
Sub ConvJSON()

    Dim outStream As ADODB.Stream
    Set outStream = New ADODB.Stream
    
    'UTF8形式.
    With outStream
        .Type = adTypeText
        .Charset = "UTF-8"
        .LineSeparator = adLF
        .Open
    End With
    
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
    
    Dim datFile As String
    
    '保存する名前（パス）を決定します.
    'このワークブックと同じディレクトリにワークブック名で書き込みます（拡張子はjson）.
    datFile = ActiveWorkbook.Path & "\" & Replace(ThisWorkbook.Name, ".xlsm", ".json")
    
    'はじめのカッコを書きます.
    outStream.WriteText "[", adWriteLine
    
    Dim i As Long
    Dim result As String
    
    '上の行はカラム名などの不要なデータなのでとばします.
    Dim n As Long
    n = 2
    
    '順番にデータを書き込んでいきます.
    Do While ws.Cells(n, 1).Value <> ""

        '最初のカラムを参照するので初期化.
        i = 1
        
        result = "    { "
        
        'カラム名 : データの値 で1つずつ処理.
        Do While ws.Cells(2, i).Value <> ""
            result = result + """"
        
            result = result + ws.Cells(1, i).Value
            
            result = result + """"
            
            result = result + " : "
            
            result = result + """"
            
            result = result + Format(ws.Cells(n, i).Value, "@")
            
            result = result + """"
            
            result = result + ", "
            
            i = i + 1
        Loop
        
        result = result + "},"

        '1行分書き込んで、次のデータへ.
        outStream.WriteText result, adWriteLine
        
        n = n + 1
        
    Loop
    
    '終わりのカッコを書きます.
    outStream.WriteText "];", adWriteLine
    
    'ファイルを保存いたします.
    outStream.SaveToFile datFile, adSaveCreateOverWrite
    outStream.Close
    
    '保存場所のダイアログを出して終わります.
    MsgBox datFile & "に書き出しました"
 
End Sub

```