A source generator that automatically generates a cache of components for Unity.
ComponentCacheGeneratorはUnity用に作成されたComponentのキャッシュ処理を自動生成を提供するSource Generatorです。GetComponent<T>()
の取得をキャッシュするコードをSource Generatorで生成することでコードの記述量を削減します。
- Unity 2022.2 以上
- Window > Package ManagerからPackage Managerを開く
- 「+」ボタン > Add package from git URL
- 以下のURLを入力する
https://github.com/AnnulusGames/ComponentCacheGenerator.git?path=src/ComponentCacheGenerator/Assets/ComponentCacheGenerator
またはPackages/manifest.jsonを開き、dependenciesブロックに以下を追記
{
"dependencies": {
"com.annulusgames.component-cache-generator": "https://github.com/AnnulusGames/ComponentCacheGenerator.git?path=src/ComponentCacheGenerator/Assets/ComponentCacheGenerator"
}
}
UnityにおいてGetComponent<T>()
でコンポーネントを取得する処理は高コストであることがよく知られており、使用する際はAwake()
やStart()
で参照をあらかじめキャッシュしておくことが一般的です。また、各コンポーネントの追加忘れを防止するために[RequireComponent(typeof(T))]
を併用することも多くなります。これらはパフォーマンスや保守性の向上のために必要ですが、コンポーネントが増えていくとコードの記述量が増加していきます。
using UnityEngine;
[RequireComponent(typeof(FooComponent))]
[RequireComponent(typeof(BarComponent))]
[RequireComponent(typeof(BazComponent))]
public class SomeBehaviour : MonoBehaviour
{
FooComponent fooComponent;
BarComponent barComponent;
BazComponent bazComponent;
void Awake()
{
fooComponent = GetComponent<FooComponent>();
barComponent = GetComponent<BarComponent>();
bazComponent = GetComponent<BazComponent>();
}
void Update()
{
fooComponent.Foo();
barComponent.Bar();
bazComponent.Baz();
}
}
ComponentCacheGeneratorは[GenerateComponentCache]
属性を使用してこれらのコードを自動生成します。
using UnityEngine;
using ComponentCacheGenerator;
[GenerateComponentCache(typeof(FooComponent))]
[GenerateComponentCache(typeof(BarComponent))]
[GenerateComponentCache(typeof(BazComponent))]
public partial class SomeBehaviour : MonoBehaviour
{
void Update()
{
fooComponent.Foo();
barComponent.Bar();
bazComponent.Baz();
}
}
ComponentCacheGeneratorは各コンポーネントをキャッシュするプロパティとCacheComponents()
メソッドを生成します。また、対象がAwake()
メソッドを持たない場合はクラス内に自動で追加されます。(対象のクラスが既にAwake()
を持っている場合は手動でCacheComponents()
を呼ぶ必要があることに注意してください。)
// Awakeが存在しない場合は自動で追加される
void Awake()
{
CacheComponents()
}
また、生成されるキャッシュのプロパティ名を指定することも可能です。指定がない場合には対象のコンポーネントのクラス名をlower camel caseに変換した名前が使用されます。
using UnityEngine;
using ComponentCacheGenerator;
[GenerateComponentCache(typeof(FooComponent), "foo")]
[GenerateComponentCache(typeof(BarComponent), "bar")]
[GenerateComponentCache(typeof(BazComponent), "baz")]
public partial class SomeBehaviour : MonoBehaviour
{
void Update()
{
foo.Foo();
bar.Bar();
baz.Baz();
}
}
[GenerateComponentCache]
属性のプロパティの値を指定することで、生成コードの設定を行うことが可能です。
プロパティ | 説明 |
---|---|
SearchScope | コンポーネントを探索する範囲を指定します。複数指定された場合はSelf > Children > Parentの順番で探索を行います。(デフォルトはSelf) |
IsRequired | IsRequiredがtrueの場合、CacheComponents() でコンポーネントが見つからなかったときに例外をスローします。また、探索範囲がSelfの場合は[RequireComponent] 属性を自動で生成します。(デフォルトはtrue) |