💦
【URP12】自作のRendererFeatureのメニュー名を変える
環境
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()は、以下のように実装されています。
DisallowMultipleRendererFeature
の customTitle
を取得していることが分かります。
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