Skip to content

Latest commit

 

History

History
203 lines (155 loc) · 5.97 KB

README_JP.md

File metadata and controls

203 lines (155 loc) · 5.97 KB

Unity CodeGen

Code Generation Library for Unity Editor

license

English README

概要

Unity CodeGenは、Unityエディタ上でのコード生成を効率化するライブラリです。 ICodeGeneratorを継承した独自のGeneratorを定義することで、コードの生成を自動的に行うことができます。

特徴

  • エディタ上でのコード生成をスムーズに実装可能
  • コンパイル時に自動で生成が可能

セットアップ

要件

  • Unity 2020.1 以上

インストール

  1. Window > Package ManagerからPackage Managerを開く
  2. 「+」ボタン > Add package from git URL
  3. 以下を入力する

あるいは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

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を定数として管理するクラスを生成するサンプル。

ライセンス

MIT License