Files
TheDeclineOfWarriors/Assets/Editor/Urp3DWebGlMigration.cs
T
2026-04-07 03:48:26 +07:00

90 lines
3.6 KiB
C#

using UnityEditor;
using UnityEngine;
using System;
using System.Reflection;
namespace Project.Editor
{
internal static class Urp3DWebGlMigration
{
private const string MigrationVersionKey = "Project.URP3DWebGLMigration.v1";
private const string SettingsFolder = "Assets/Settings";
private const string PipelineAssetPath = SettingsFolder + "/UniversalRP.asset";
private const string RendererAssetPath = SettingsFolder + "/UniversalRenderer.asset";
private const string OldRendererAssetPath = SettingsFolder + "/Renderer2D.asset";
private const string UniversalRuntimeAssembly = "Unity.RenderPipelines.Universal.Runtime";
private const string PipelineAssetTypeName = "UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset";
private const string RendererDataTypeName = "UnityEngine.Rendering.Universal.UniversalRendererData";
[InitializeOnLoadMethod]
private static void RunOnLoad()
{
EditorApplication.delayCall += TryMigrate;
}
[MenuItem("Tools/Rendering/Run URP 3D WebGL Migration")]
private static void RunFromMenu()
{
SessionState.EraseString(MigrationVersionKey);
TryMigrate();
}
private static void TryMigrate()
{
if (SessionState.GetString(MigrationVersionKey, string.Empty) == "done")
{
return;
}
SessionState.SetString(MigrationVersionKey, "done");
Type pipelineAssetType = Type.GetType($"{PipelineAssetTypeName}, {UniversalRuntimeAssembly}");
Type rendererDataType = Type.GetType($"{RendererDataTypeName}, {UniversalRuntimeAssembly}");
if (pipelineAssetType == null || rendererDataType == null)
{
return;
}
UnityEngine.Object pipelineAsset = AssetDatabase.LoadAssetAtPath(PipelineAssetPath, pipelineAssetType);
if (pipelineAsset == null)
{
return;
}
UnityEngine.Object rendererData = AssetDatabase.LoadAssetAtPath(RendererAssetPath, rendererDataType);
if (rendererData == null)
{
rendererData = ScriptableObject.CreateInstance(rendererDataType);
AssetDatabase.CreateAsset(rendererData, RendererAssetPath);
InvokeNonPublicMethod(rendererData, "OnValidate");
}
SerializedObject pipelineObject = new SerializedObject(pipelineAsset);
pipelineObject.FindProperty("m_RendererType").intValue = 0;
pipelineObject.FindProperty("m_RendererData").objectReferenceValue = rendererData;
SerializedProperty rendererList = pipelineObject.FindProperty("m_RendererDataList");
rendererList.arraySize = 1;
rendererList.GetArrayElementAtIndex(0).objectReferenceValue = rendererData;
pipelineObject.FindProperty("m_DefaultRendererIndex").intValue = 0;
pipelineObject.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(rendererData);
EditorUtility.SetDirty(pipelineAsset);
AssetDatabase.SaveAssets();
if (AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(OldRendererAssetPath) != null)
{
AssetDatabase.DeleteAsset(OldRendererAssetPath);
}
}
private static void InvokeNonPublicMethod(object target, string methodName)
{
target.GetType()
.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic)
?.Invoke(target, null);
}
}
}