ExcelVBA:JSONを出力してUnityに使用する方法の紹介

タイトル装飾

ExcelVBA:JSONを出力してUnityに使用する方法の紹介

タグはありません。

 

 

ExcelVBA:JSONを出力してUnityに使用する方法の紹介

 

Excel VBA で作成したデータを JSON 化し、そのまま Unity に読み込ませたい──  

そんなとき「どうやって JSON を作ればいいの?」「JsonUtility で読み込める形式って?」と迷ったことはありませんか?

 

本記事では、Excel を使ってゲームデータを手軽に作成 → VBA で JSON 出力 → Unity で読み込んで使う方法を、サンプル付きで分かりやすく解説していきます

目次

必要なもの

Excel(VBA)の準備

仮データ作成

JsonConverterのインポートと設定

JSON出力マクロ作成

Unityの準備

JsonHelperクラス

実際に出力したJsonを読み込む

最後に

参考したサイト

必要なもの

  • マクロ有効のエクセルブック(.xlsm)
  • JsonConverter
  • Unity(6000.0.50f1を使っています)

Excel(VBA)の準備

仮データ作成

まずは、Unity に使うデータを作成しましょう。今回は簡単な敵キャラクタの攻撃パターンの情報表を作っていこうと思います。

Type                – 攻撃パターンのID

Atk_Dmg        – 攻撃ダメージ

Atk_Rng        – 攻撃の範囲

Atk_Spd        – 攻撃の速度

この形式で作成すると、1行目を Key にし、2行目以降はその行全体が1つのデータになります。列は各データの Key に入っている値にします。次は、この表をJSONのリストデータに変換して作っていきます。

JsonConverterのインポートと設定

VBAを書く前に、Dictionary を JSON に簡単に変換できるツールを紹介したいと思います。

こちらのGITHUBから「<> Code」のボタンで ZIP ファイルをダウンロードしてください。

ZIP ファイルを展開してから、準備したエクセルブックにインポートしていきます。インポートするファイルは「JsonConverter.bas」です。

インポートできたら、上のツールバーにて「ツール」>「参照設定」を選択します。「参照設定」を開いてから、「Microsoft Scripting Runtime」を有効に設定してください。

これで問題なく JsonConverter の関数を使ってマクロを作成できます。

JSON出力マクロ作成

JsonConverter は Dictionary を JSON 形式の文字列に変換してくれます。そのため、表のデータを Dictionary 化する必要があります。ただし、1行目をそのまま Key にすると、重複のエラーが発生してしまいます。解決方法は2つの Dictionary を使用して、「dataEntry」は1行ずつのデータを取得し、「dataGroup」にその行のデータを入れ込みます。

※日本語をソースコードに書くと、他のブックなどにコピーすると文字化けが起きる場合があるため、できる限り英語で書いていきましょう。

For iRow = 2 To LR
groupName = dbData(iRow,
1)

‘format dataEntry set
Set dataEntry = CreateObject(“Scripting.Dictionary”)

‘add each column of current row into dataEntry
For iCol = 1 To lenCol
dataEntry.Add dbData(
1, iCol), dbData(iRow, iCol)
Next iCol

‘add current data group into main group
dataGroup.Add iRow, dataEntry

Next iRow

表を全部 dataGroup に整理できたら、再度 Dictionary に入れ込む必要があります。

ここで、Unity の JsonUtility を使用してラッパークラスのメンバーを一致させる必要があります。整理したデータを Dictionary の Key に「array」の文字列を入れていきます。これで、表のデータは「array」という名前の配列の形式に変換されました。

‘Add to json dictionary
Dim key As String
key =
“array”
json.Add key, dataGroup.Items

‘Set output file name
Dim fileName As String
fileName =
“EnemyData”

‘ Convert to JSON string
Dim jsonString As String
jsonString = JsonConverter.ConvertToJson(json, Whitespace:=
2)

全体的な VBA ソースコードはこうなります。

Sub TestJson()
‘Initialize target worksheet
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet

‘Initialize json object
Dim json As Object
Set json = CreateObject(“Scripting.Dictionary”)

‘Initialize data group & entry object
Dim dataGroup, dataEntry As Object
Set dataGroup = CreateObject(“Scripting.Dictionary”)

‘Initialize last row of used range
Dim LR As Long
LR = ws.Cells(Rows.Count,
1).End(xlUp).Row

‘Initialize sheet’s data range (array)
Dim dbData As Variant
dbData = ws.Range(
“A1:D” & LR)

‘Initialize last row and column of data
Dim lenRow, lenCol As Long
lenRow =
UBound(dbData, 1) – LBound(dbData, 1) + 1
lenCol =
UBound(dbData, 2) – LBound(dbData, 2) + 1

‘For Loop: data -> dictionary
Dim groupName, oldGroupName As String
Dim iRow As Long
For iRow = 2 To LR
groupName = dbData(iRow,
1)

‘New dataEntry Set
Set dataEntry = CreateObject(“Scripting.Dictionary”)

‘add each column of current row into dataEntry
For iCol = 1 To lenCol
dataEntry.Add dbData(
1, iCol), dbData(iRow, iCol)
Next iCol

‘add current data group into main group
dataGroup.Add iRow, dataEntry

Next iRow

‘Add to json dictionary
Dim key As String
key =
“array”
json.Add key, dataGroup.Items

‘Set output file name
Dim fileName As String
fileName =
“EnemyData”

‘ Convert to JSON string
Dim jsonString As String
jsonString = JsonConverter.ConvertToJson(json, Whitespace:=
2)

‘Print Json (utf-8)
With CreateObject(“ADODB.Stream”)
.Type =
2
.Charset =
“utf-8”
.Open
.WriteText jsonString,
1
.SaveToFile ThisWorkbook.Path &
“/” & fileName & “.json”, 2
.Close
End With

‘Finished Notification
MsgBox “Print “ & fileName & “.json completed!”
End Sub

出力された JSON の中身はこの形になります。

{
“array”: [
{
“Type”:
“E001”,
“Atk_Dmg”:
30,
“Atk_Rng”:
1,
“Atk_Spd”:
5
}.my-custom-style .my-custom-style ,
{
“Type”:
“E002”,
“Atk_Dmg”:
40,
“Atk_Rng”:
2,
“Atk_Spd”:
5
}.my-custom-style .my-custom-style ,
{
“Type”:
“E003”,
“Atk_Dmg”:
45,
“Atk_Rng”:
1,
“Atk_Spd”:
8
}.my-custom-style .my-custom-style ,
{
“Type”:
“B001”,
“Atk_Dmg”:
50,
“Atk_Rng”:
4,
“Atk_Spd”:
7
}.my-custom-style .my-custom-style ,
{
“Type”:
“B002”,
“Atk_Dmg”:
30,
“Atk_Rng”:
3,
“Atk_Spd”:
10
}.my-custom-style .my-custom-style
]
}.my-custom-style .my-custom-style

次は、出力した JSON ファイルを Unity に入れていきましょう!

Unityの準備

JsonHelperクラス

最後の準備は、Json ファイルを読み込む処理です。ゲーム開発のプロジェクトでは何回でも使いまわせるのが望ましいので、目指して作っていきましょう。

JsonUtility.FromJson() の結果を配列にするのに、ラッパークラスが必要があります。

JSON 出力のソースコードに既に「array」の文字列が準備されたので、それをここに活かしていきます。

public static class JsonHelper
{
public static T[] FromJson<T> (string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.array;
}.my-custom-style .my-custom-style

[System.Serializable]
private class Wrapper<T>
{
public T[] array;
}.my-custom-style .my-custom-style
}.my-custom-style .my-custom-style

実際に出力したJsonを読み込む

それでは、SampleScene に簡単な実行用の GameObject を作成して、JsonHelper を使って出力した JSON ファイルを配列に読み込んでみましょう。

public class JsonReader : MonoBehaviour
{
[
Serializable]
public class EnemyData
{
public string Type;
public int Atk_Dmg;
public int Atk_Rng;
public int Atk_Spd;
}.my-custom-style .my-custom-style

[SerializeField] private TextAsset jsonText;

private EnemyData[] enemyData;

void Start()
{
enemyData = JsonHelper.FromJson<EnemyData>(jsonText.text);
}.my-custom-style .my-custom-style
}.my-custom-style .my-custom-style

プレイモードを実行して、ブレイクポイントで enemyData の配列を確認しましょう。

これで JSON を配列化する処理のベースの部分が出来上がりました!

最後に

お疲れさまでした!

ここまでで、

  • Excel でデータを作る方法
  • VBA を使った JSON 出力
  • Unity で読み込むための最低限必要なクラス  

をすべて作成できました。

この仕組みは、敵キャラのパラメータ・アイテム一覧・ストーリー進行フラグなど、  

さまざまなゲーム用データに応用できます。

参考したサイト

https://docs.unity3d.com/ScriptReference/JsonUtility.FromJson.html

https://teratail.com/questions/247549

 

作者
  N.P
  PG

目次

目次を生成中...