Code Generation Library for Unity Editor
Unity CodeGenは、Unityエディタ上でのコード生成を効率化するライブラリです。 ICodeGeneratorを継承した独自のGeneratorを定義することで、コードの生成を自動的に行うことができます。
- エディタ上でのコード生成をスムーズに実装可能
- コンパイル時に自動で生成が可能
- Unity 2020.1 以上
- Window > Package ManagerからPackage Managerを開く
- 「+」ボタン > Add package from git URL
- 以下を入力する
あるいはPackages/manifest.jsonを開き、dependenciesブロックに以下を追記
{
"dependencies": {
"com.annulusgames.unity-codegen": "https://github.com/AnnulusGames/UnityCodeGen.git?path=/Assets/UnityCodeGen"
}
}
任意のEditorフォルダ以下にcsファイルを作成し、ICodeGeneratorを継承したクラスを実装します。 以下は、空のSampleクラスを生成するGeneratorです。
using UnityCodeGen;
[Generator] // Generator属性を追加
public class SampleGenerator : ICodeGenerator // ICodeGeneratorを継承
{
public void Execute(GeneratorContext context) // Executeメソッドを実装
{
context.AddCode("Sample.Generated.cs", // ファイル名
@"// <auto-generated/>
namespace SampleNamespace.Generated
{
public class Sample
{
}
}"
);
}
}
エディタに戻り、Tools/UnityCodeGen/Generateを選択してコードを生成します。
生成されたコードは指定がない限りAssets/UnityCodeGen.Generatedに配置されます。
// <auto-generated/>
namespace SampleNamespace.Generated
{
public class Sample
{
}
}
GeneratorContext.OverrideFolderPathを利用することで、出力先のフォルダを指定することができます。
public void Execute(GeneratorContext context)
{
context.OverrideFolderPath("Assets/YourFolder/Generated");
...
}
Tools/UnityCodeGen/Auto-generate on Compileにチェックを入れることでコード生成を自動化することが可能です。
Auto-generate on CompileがOnの場合、コンパイル終了時にGenerateを自動で実行し、生成コードになんらかの変更があった場合のみ再コンパイルを行います。
UnityCodeGenUtilityクラスを利用することで、スクリプトから操作することも可能です。
// デフォルトの出力フォルダのパスを取得
var path = UnityCodeGenUtility.defaultFolderPath;
// 生成を実行
UnityCodeGenUtility.Generate();
UnityのTypeCacheを利用することで、特定の属性が付加されたクラスを一括で取得することができます。 これを使うことで、特定の属性が付加されたクラスに対してコードを生成することが可能になります。
例として、AddToStringAttributeが付加されたクラスに対し、全てのpublicなフィールドを表示するようにToStringをoverrideするコードを生成してみましょう。
まずは、Generatorの識別に用いる属性を定義します。
using System;
public class AddToStringAttribute : Attribute { }
次にGeneratorを作成します。このファイルは任意のEditorフォルダ以下に配置する必要があることに注意してください。
using System.Linq;
using UnityEditor;
using UnityCodeGen;
[Generator]
public class AddToStringGenerator : ICodeGenerator
{
public void Execute(GeneratorContext context)
{
var types = TypeCache.GetTypesWithAttribute<AddToStringAttribute>();
foreach (var t in types)
{
var publicFields = t.GetFields()
.Where(x => x.IsPublic && !x.IsStatic)
.Select(x => $"{x.Name}:{{{x.Name}}}");
var toString = string.Join(", ", publicFields);
var code =
$@"// <auto-generated/>
partial class {t.Name}
{{
public override string ToString()
{{
return $""{toString}"";
}}
}}";
context.AddCode($"{t.FullName}.AddToString.Generated.cs", code);
}
}
}
これで生成の準備は完了です。 適当なクラスを作成し、AddToStringAttributeを追加します。
using UnityEngine;
[AddToString]
public partial class FooClass
{
public int foo;
public string bar;
public Vector3 baz;
}
Generateを実行すると、UnityCodeGen.Generatedフォルダ以下にFooClass.AddToString.Generated.csが生成されます。
// <auto-generated/>
partial class FooClass
{
public override string ToString()
{
return $"foo:{foo}, bar:{bar}, baz:{baz}";
}
}
Unity CodeGenのサンプルはPackage Managerから手に入れることができます。 以下は、パッケージに含まれるサンプルの一覧です。
サンプル名 | 説明 |
---|---|
Tags & Layers | Tags、Layers、Sorting Layersを定数として管理するクラスを生成するサンプル。 |