Files
2026-11-01 23:39:55 +02:00

90 lines
3.5 KiB
C#

using System;
using UnityEditor.Rendering.Converter;
using UnityEngine;
using UnityEngine.Categorization;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace UnityEditor.Rendering.Universal
{
[Serializable]
[PipelineConverter("Built-in", "Universal Render Pipeline (2D Renderer)")]
[BatchModeConverterClassInfo("BuiltInToURP2D", "RenderSettings2D")]
[ElementInfo(Name = "Rendering Settings",
Order = int.MinValue,
Description = "This converter creates Universal Render Pipeline (URP) assets and corresponding Renderer assets, configuring their settings to match the equivalent settings from the Built-in Render Pipeline.")]
class BuiltInToURP2DRenderSettingsConverter : RenderSettingsConverter
{
public override bool isEnabled => true;
public override string isDisabledMessage => string.Empty;
protected override RenderPipelineAsset CreateAsset(string name)
{
string path = $"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/{name}.asset";
if (AssetDatabase.AssetPathExists(path))
return AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(path);
try
{
CoreUtils.EnsureFolderTreeInAssetFilePath(path);
var asset = ScriptableObject.CreateInstance(typeof(UniversalRenderPipelineAsset)) as UniversalRenderPipelineAsset;
AssetDatabase.CreateAsset(asset, path);
AssetDatabase.SaveAssetIfDirty(asset);
return asset;
}
catch (Exception ex)
{
Debug.LogError($"Unable to create asset at path {path} with exception {ex.Message}");
return null;
}
}
Renderer2DData CreateRenderer2DDataAsset()
{
string path = $"Assets/{UniversalProjectSettings.projectSettingsFolderPath}/Default_2D_Renderer.asset";
if (AssetDatabase.AssetPathExists(path))
return AssetDatabase.LoadAssetAtPath<Renderer2DData>(path);
CoreUtils.EnsureFolderTreeInAssetFilePath(path);
var asset = Renderer2DMenus.CreateRendererAsset(path, RendererType._2DRenderer, relativePath: false) as Renderer2DData;
EditorUtility.SetDirty(asset);
AssetDatabase.SaveAssetIfDirty(asset);
return asset;
}
void GetRenderers(out ScriptableRendererData[] renderers, out int defaultIndex)
{
defaultIndex = 0;
using (ListPool<ScriptableRendererData>.Get(out var tmp))
{
tmp.Add(CreateRenderer2DDataAsset());
// In case we need multiple renderers modify the defaultIndex and add more renderers here
// ...
renderers = tmp.ToArray();
}
// Tell the asset database to regenerate the fileId, otherwise when adding the reference to the URP
// asset the fileId might not be computed and the reference might be lost.
AssetDatabase.Refresh();
}
protected override void SetPipelineSettings(RenderPipelineAsset asset)
{
if (asset is not UniversalRenderPipelineAsset urpAsset)
return;
GetRenderers(out var renderers, out var defaultIndex);
urpAsset.m_RendererDataList = renderers;
urpAsset.m_DefaultRendererIndex = defaultIndex;
}
}
}