ValueOnlyバイナリフォーマット
Wienerが Static Game Data に使用する独自バイナリフォーマット「ValueOnly」の技術概要です。
ValueOnlyとは
JSONのような自己記述形式は、データとともにキー名を格納します。
{ "item_id": 1001, "name": "Sword", "hp": 0, "attack": 45 }
ValueOnlyはキー名をバイナリに格納せず、コンバート時に生成したC#コードのフィールド順序に従って値を読み込みます。現行の Unity Asset Store 版 1.0.0 では、Unity向けC#コードとバイナリを同じコンバート結果から生成して使用します。
読み込みの仕組み
自己記述形式:
データ受信 → 形式の解析 → キー名の解決 → 値取得
ValueOnly:
データ受信 → 生成コードの順序で値取得
キー名の照合を省けることがValueOnlyの特徴です。ただし、実際のロード時間はデータ量、フィールド型、実行環境、ストレージ、生成設定などに依存します。特定のセル数や時間を保証するものではないため、対象プロジェクトのデータと端末で計測してください。
セキュリティ上の位置付け
キー名を格納しないため、単純な文字列検索では構造を把握しにくくなります。一方で、ValueOnlyは暗号化・署名・アクセス制御ではなく、機密性や真正性を保証しません。重要な秘密情報や権限判定はクライアントに含めず、サーバー側で管理してください。
必要に応じて 軽量難読化・変更検知 を併用できますが、これも暗号学的な保護ではありません。
生成されるコードとの関係
ValueOnlyはWienerが生成するコードとセットで機能します。
// Wienerが生成するコード(例)
public class ItemData : IWienerDictionaryData<int>
{
public int ItemId { get; private set; }
public string Name { get; private set; }
public int Attack { get; private set; }
public void Read(WienerDataReader reader)
{
ItemId = reader.ReadInt32();
Name = reader.ReadString();
Attack = reader.ReadInt32();
}
}
readerはバイナリを先頭から順に読み進め、各 ReadXXX 呼び出しに応じて内部位置を進めます。そのため、生成コードと basic.bytes は同じコンバート結果から作成してください。
通常の LoadBasicPack は、生成コードとバイナリの構造が一致していることを前提にロードします。開発中に両者が一時的にずれた場合は、LoadBasicPackFromHash を使用すると、バイナリ内のハッシュと一致する変数だけを読み込めます。バイナリに存在しない変数は既定値になり、生成コードに存在しないデータは無視されます。
LoadBasicPackFromHash は差分開発・検証用で、通常ロードより追加の処理が発生します。リリース用途では、生成コードとバイナリを同時に更新し、LoadBasicPack を使用してください。
制約
ValueOnlyは汎用形式ではなく、対応するWiener生成コードが必要です。デバッグや他システムとの連携には、用途に応じて CSV、SQL(CSV)、JSON を使用してください。
将来提供予定の Standalone 版・UE5向けC++コード生成は、現行の Unity Asset Store 版 1.0.0 には含まれません。