ゲームを作りこめば作りこむほど大量になっていく「ゲームデータ」。
最初はソースコードに書き足していったんだけど、もう整理がつかなくなってきてワケがわからない…。
せめてエクセルでフィルタやソートできれば…。
そんな時はソースコードからエクセルを作っちゃいましょう。
Mac 使いの IT / Web 系企業では微妙な顔されそうですが、unity (windows) で開発してたりするとそこそこ使う機会はあると思います。
テスト環境
unity で作ったサンプル環境です。
変換部分(ソースコード)については、unity でなくても動作します。
(NPOI が必要です)
環境
確認方法
- unity でプロジェクトを開く
- MapTable.cs を確認する(この中身をエクセルに出力します)
- 左上のメニュー Tools > SaveXLS を選択
- OutputTable.xlsx が出力される
説明
言葉で説明するより、ソースコードを見てもらった方が早いかもしれません。
Editor/SaveXlsx.cs がエクセルを作成しているコードです。
MapTable(.cs)
「とりあえずゴリゴリと、ソースコードでデータ作ってった」的なサンプルです。
public static List<Row> Rows = new List<Row>() { new Row() {ID = 1, Type = eMapObject.Wall, StageNo = 1}, new Row() {ID = 2, Type = eMapObject.WallLine, StageNo = 1}, new Row() {ID = 3, Type = eMapObject.Enemy00, StageNo = 1}, new Row() {ID = 4, Type = eMapObject.Wall, StageNo = 2}, new Row() {ID = 5, Type = eMapObject.Wall, StageNo = 3} };
ヘッダ部分
今回はテストなので、予めヘッダが書いてあるエクセルを読み込んでいます(MapTableHeader.xlsx)。
より実用的にするなら、MapTable からリフレクションで自動生成するとか。
データ部分
ヘッダの1行下から、MapTable のデータを1セルずつ書き込んでいきます。
ExcelRow クラスは、NPOI をより簡単に扱うためのシュガーシンタックスです。
for (int i = 0; i < data.Count; i++) { var erow = new ExcelRow(sheet, rowIndex); var dataRow = data[i]; // 列A に ID erow.CellValue(0, dataRow.ID); // 列B に Type erow.CellValue(1, dataRow.Type.ToString()); // 列C に StageNo erow.CellValue(2, dataRow.StageNo); rowIndex++; }
ファイルを書き出す
book.Write() で書き出します。
注意点ですが、(なぜか)既にあるエクセルファイルを更新しようとするとエクセルファイルが壊れてしまうようです。
そのため、ファイルを1度消してから新規作成しています。
そういうもんだと割り切って、深追いはしない
エクセルからゲームで使えるデータに変換したいんだけど?
過去に記事を書きましたので、そちらをご覧ください。
(こちらはテストではなく、実用的な Editor 機能なので大き目。エクセルを Scriptable Object に変換します)
Scriptable Object からエクセルにする方法はこちら。