[unity] XlsToJson 実際に運用する際のちょっとしたテクニック

XlsToJson の基本的な使い方はこちらを参照してください。

本記事は、書きそびれたいくつかのテクニックを紹介しておきます。

手修正した Json や Scriptable Object を、エクセルに逆出力したい

unity でパラメータを修正しながら動作を確認するようなツールを作成した場合、こういった逆出力が必要になるかもしれません。

Tools/XlsToJson/[Xlsx Update] JsonData(Scriptable Object) -> ????.xlsx を実行することでテーブルをエクセルに書き出すことができます。

但し、enum やサブクラスは逆出力できません。これらを修正したい場合、必ずエクセルで行うようにしてください。

また、残念ながら const 設定値は素の値になってしまいます…こちらは仕様とさせてください。

シート(テーブル)によって出力形式(Json / ScriptableObject)を切り分けたい

簡単なのは出力形式によってエクセルファイルを分けることです。
それぞれのエクセルファイルで XlsToJson Settings… を使い、必要な出力形式のみにチェックを入れて作成します。

CREATE Importer したら自動生成されたコードでエラーになり、詰んだ

エクセルの記述ミスなどでコードにエラーが発生するかもしれません。
Editor/uindies/XlsToJson/importer 内のコードでエラーの場合は、一旦全部消してしまうのもアリですが、テーブルクラスやアクセッサクラスでこの状態になると、既にテーブルを使用したゲームクラスとの兼ね合いで泣く泣く手修正(不毛)することにも…。

既に出来上がっているテーブルクラスの更新は危険が伴うので、更新前にはバックアップしておきましょう。CREATE Importer で再作成する前に、Git にコミットしておく事をオススメします。

XlsToJson の不具合のようであれば、ご報告お願いします!

データをIDで検索する

XlsToJson ではオートナンバリングされた ID というフィールドが必要ですが、このフィールドを使って行を検索することができます。
アクセッサを使った例を示します。

var row = Character.FindRowByID(1);
Debug.Log($"{row.CharacterName}"); // 結果は Jessie

ID 以外のフィールドを Find 対象にする

ID だけではなく、例えば CharacterName から行データを取得したい場合、CharacterName* とエクセルに記述してください。(アスタリスクをつける)

すると、クラスに FindRowByCharacterName というメソッドが新たに自動作成されます。

var row = Character.FindRowByCharacterName("Bob");
Debug.Log($"{row.CharacterNo}"); // 結果は 2

Find 対象にするフィールド内容は重複しないようにしてください。
重複している場合、その中で最初に見つかった1つしか検索することはできません。

条件により、複数のデータを抽出する

このようなデータで、「女性(Female)だけ」を抜き出したいケース。
残念ながら、XlsToJson だけでこれを満たすコードは自動生成されませんので、以下のように抽出クラス(CharacterEx.cs)を作成します。

using System.Collections.Generic;

public partial class Character
{
    public static List<Class_Character.Row> FindRowsBySex(Class_Character.Sex sex)
    {
        return Rows.FindAll( (row) => row.Sex == sex );
    }
}

ソース名は CharacterEx.cs ですが、クラスは Character であり、partial としてある点がミソです。
こうすることで、例えテーブルの形が変わり、後にアクセッサのコードを作り直したとしても、自前で作成したコードは残り、上書きされることはありません。
使い方も今までと同じ。

var list = Character.FindRowsBySex(Class_Character.Sex.Female);
list.ForEach((row) => Debug.Log($"{row.ID} {row.CharacterName} {row.Sex}"));

返信を残す

メールアドレスが公開されることはありません。

CAPTCHA