💦

【URP12】自作のRendererFeatureのメニュー名を変える

2022/04/23に公開

環境

Universal RP 12.1.4

はじめに

ScriptableRendererFeature を継承したクラスを作ると、
Universal Renderer Data の Add Renderer Feature のメニューに候補として出現します。

public class EdgeDetectFeature : ScriptableRendererFeature

メニュー名を変える

メニュー名を変えたい場合、DisallowMultipleRendererFeature を利用します。

以下のように使用します。

[DisallowMultipleRendererFeature("MyFeature/Edge Detect")]
public class EdgeDetectFeature : ScriptableRendererFeature
{

MyFeature というグループが作られ、その中の Edge Detect として表示されるようになります。

メニューから隠す

abstractなクラスを作る場合など、メニューに表示させたくないケースも存在します。

public abstract class PostProcessFeature : ScriptableRendererFeature
{

customTileを / から始めることで、メニューに表示させないようにできます。

[DisallowMultipleRendererFeature("/Post Process")]
public abstract class PostProcessFeature : ScriptableRendererFeature
{

余談 : RendererFeatureのメニュー登録処理

RendererFeatureのメニューの登録処理は、以下のように実装されています。

メニューへの登録

Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs
private void AddPassMenu()
{
    GenericMenu menu = new GenericMenu();
    TypeCache.TypeCollection types = TypeCache.GetTypesDerivedFrom<ScriptableRendererFeature>();
    foreach (Type type in types)
    {
        var data = target as ScriptableRendererData;
        if (data.DuplicateFeatureCheck(type))
        {
            continue;
        }

        string path = GetMenuNameFromType(type);
        menu.AddItem(new GUIContent(path), false, AddComponent, type.Name);
    }
    menu.ShowAsContext();
}

メニュー名の取得

GetCustomTitle() でカスタムメニューの取得を行っています。

Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs
private string GetMenuNameFromType(Type type)
{
    string path;
    if (!GetCustomTitle(type, out path))
    {
        path = ObjectNames.NicifyVariableName(type.Name);
    }

    if (type.Namespace != null)
    {
        if (type.Namespace.Contains("Experimental"))
            path += " (Experimental)";
    }

    return path;
}

GetCustomTitle()は、以下のように実装されています。
DisallowMultipleRendererFeaturecustomTitle を取得していることが分かります。

Packages/com.unity.render-pipelines.universal/Editor/ScriptableRendererDataEditor.cs
private bool GetCustomTitle(Type type, out string title)
{
    var isSingleFeature = type.GetCustomAttribute<DisallowMultipleRendererFeature>();
    if (isSingleFeature != null)
    {
        title = isSingleFeature.customTitle;
        return title != null;
    }
    title = null;
    return false;
}

Discussion