要件
Unityのエディタ拡張として、定義ファイルを元に以下のようなEnumやClassを生成したい
※ なるべくUnity単体で完結したい。Visual StudioやRiderのようなIDEが入っていないエンジニア以外のメンバーでも生成が行えるのが理想
public enum SceneType
{
None,
Splash,
Title,
Home,
// 以下略
}
public class AddressDefine
{
public class LocalGroup
{
public const string TitlePrefab = "titleprefab";
}
public class MasterData
{
public const string CharacterMaster = "charactermaster";
}
}
文字列操作で作る
StringBuilder
などを使ってインデントなども含めたソースコードの表現した文字列を生成しファイルに書き込む方式。
#CLASS_NAME# のような置換用文字列を含んだ独自のテンプレートファイルを処理する形だと、インデントなどのコードフォーマットを実装と分離できるけれど、定義ファイル次第でフィールドの数が可変になるケースに対応できない。
参考1: CodeStorage/ScriptBuilder.cs at main · yamara-mh/CodeStorage · GitHub
参考2: enumを作成するエディタ拡張【Unity】【エディタ拡張】 - (:3[kanのメモ帳]
参考3: 【Unity】【エディタ拡張】スクリプトからスクリプトファイル(.cs)を生成する
CodeDOMで作る
イメージとしてはリフレクションの逆。ネームスペースオブジェクト、型オブジェクト、メンバオブジェクトなどソースコードの各要素を表現するオブジェクトを生成し、CSharpCodeProvider
を使ってソースコードを生成する方式。
インデントなどのコードフォーマットはCodeGeneratorOptions
で指定できる。CodeGenerator.ValidateIdentifiers()
を使うことで各オブジェクトのバリデーションも可能。
参考2: System.CodeDom 名前空間 | Microsoft Learn
参考3: CodeDomによる実行時コード生成術
参考4: DBのカラム名からClassを生成する - Qiita
テンプレートエンジンを使う
文字列操作で作るで書いた独自テンプレートではなく、著名なテンプレートエンジンを使う方式。
T4はVisual StudioやRiderなどのIDEからコードを生成する。
デザイン時テンプレートはテンプレートから目的の文字列を生成する。ランタイム時テンプレートはテンプレートから中間csファイルを生成し、それに定義されたクラスを使って目的の文字列を生成する。
Unityでソースコードを生成するには事前にIDEでランタイム時テンプレートを生成しておく必要があるけれど、GitHub - deniszykov/t4-templates-unity3d というUnity上でT4テンプレートを処理するエディタ拡張も存在している。
参考1: C#で利用できるテンプレートエンジンscribanについて | Yucchiy's Note
参考2: 【Visual Studio】【.NET】T4テキストテンプレートで文字列(ソースコード)を自動生成する方法まとめ - LIGHT11
[調査中] SourceGeneratorを使う
C# 9.0で追加された、C#公式のコード生成のためのコンポーネントでUnityでは2021.2以降で利用可能。
⚠ コンパイル時生成なので「エディタ拡張」という目的にはそぐわない。
調べた限りでは、既存のpartialクラスに対してプロパティやメソッドを自動実装する使い方が多い。
完全新規のクラスを生成できるのかは調査中。
参考1: ソース ジェネレーター | Microsoft Learn
参考2: Unity 2022におけるC#ランタイムスクリプトについて – Unity for Pro
参考3: SourceGeneratorでらくらく(でもない)ソースコード自動生成 - Qiita