Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BuiltInToURP2DMaterialUpgrader.cs 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using UnityEditor.Rendering.Universal;
  5. using UnityEngine;
  6. using UnityEngine.Rendering.Universal;
  7. namespace UnityEditor.Rendering.Universal
  8. {
  9. internal sealed class BuiltInToURP2DMaterialUpgrader : RenderPipelineConverter
  10. {
  11. public override string name => "Material and Material Reference Upgrade";
  12. public override string info => "This will upgrade all materials and material references.";
  13. public override int priority => -1000;
  14. public override Type container => typeof(BuiltInToURP2DConverterContainer);
  15. List<string> m_AssetsToConvert = new List<string>();
  16. Material m_SpriteLitDefaultMat;
  17. Material m_SpritesDefaultMat;
  18. Material m_SpritesMaskMat;
  19. Material m_SpriteMaskDefaultMat;
  20. Shader m_SpriteLitDefaultShader;
  21. Shader m_SpritesDefaultShader;
  22. string m_SpritesDefaultShaderId;
  23. string m_SpritesDefaultMatId;
  24. string m_SpritesMaskMatId;
  25. void UpgradeGameObject(GameObject go)
  26. {
  27. Renderer[] renderers = go.GetComponentsInChildren<Renderer>();
  28. foreach (Renderer renderer in renderers)
  29. {
  30. if (!PrefabUtility.IsPartOfPrefabInstance(renderer))
  31. {
  32. int materialCount = renderer.sharedMaterials.Length;
  33. Material[] newMaterials = new Material[materialCount];
  34. bool updateMaterials = false;
  35. for (int matIndex = 0; matIndex < materialCount; matIndex++)
  36. {
  37. if (renderer.sharedMaterials[matIndex] == m_SpritesDefaultMat)
  38. {
  39. newMaterials[matIndex] = m_SpriteLitDefaultMat;
  40. updateMaterials = true;
  41. }
  42. else if (renderer.sharedMaterials[matIndex] == m_SpritesMaskMat)
  43. {
  44. newMaterials[matIndex] = m_SpriteMaskDefaultMat;
  45. updateMaterials = true;
  46. }
  47. else
  48. newMaterials[matIndex] = renderer.sharedMaterials[matIndex];
  49. }
  50. if (updateMaterials)
  51. renderer.sharedMaterials = newMaterials;
  52. }
  53. }
  54. }
  55. public override void OnInitialize(InitializeConverterContext context, Action callback)
  56. {
  57. Renderer2DData data = Light2DEditorUtility.GetRenderer2DData();
  58. if (data != null)
  59. m_SpriteLitDefaultMat = data.GetDefaultMaterial(DefaultMaterialType.Sprite);
  60. else
  61. m_SpriteLitDefaultMat = AssetDatabase.LoadAssetAtPath<Material>("Packages/com.unity.render-pipelines.universal/Runtime/Materials/Sprite-Lit-Default.mat");
  62. m_SpritesDefaultMat = AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Default.mat");
  63. m_SpriteMaskDefaultMat = AssetDatabase.LoadAssetAtPath<Material>("Packages/com.unity.render-pipelines.universal/Runtime/Materials/SpriteMask-Default.mat");
  64. m_SpritesMaskMat = AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Mask.mat");
  65. m_SpriteLitDefaultShader = m_SpriteLitDefaultMat.shader;
  66. m_SpritesDefaultShader = m_SpritesDefaultMat.shader;
  67. m_SpritesDefaultShaderId = URP2DConverterUtility.GetObjectIDString(m_SpritesDefaultShader);
  68. m_SpritesDefaultMatId = URP2DConverterUtility.GetObjectIDString(m_SpritesDefaultMat);
  69. m_SpritesMaskMatId = URP2DConverterUtility.GetObjectIDString(m_SpritesMaskMat);
  70. string[] allAssetPaths = AssetDatabase.GetAllAssetPaths();
  71. foreach (string path in allAssetPaths)
  72. {
  73. if (URP2DConverterUtility.IsPSB(path) || URP2DConverterUtility.IsMaterialPath(path, m_SpritesDefaultShaderId) || URP2DConverterUtility.IsPrefabOrScenePath(path, new string[] { m_SpritesDefaultMatId, m_SpritesMaskMatId }))
  74. {
  75. ConverterItemDescriptor desc = new ConverterItemDescriptor()
  76. {
  77. name = Path.GetFileNameWithoutExtension(path),
  78. info = path,
  79. warningMessage = String.Empty,
  80. helpLink = String.Empty
  81. };
  82. // Each converter needs to add this info using this API.
  83. m_AssetsToConvert.Add(path);
  84. context.AddAssetToConvert(desc);
  85. }
  86. }
  87. callback.Invoke();
  88. }
  89. public override void OnRun(ref RunItemContext context)
  90. {
  91. string result = string.Empty;
  92. string ext = Path.GetExtension(context.item.descriptor.info);
  93. if (ext == ".prefab")
  94. result = URP2DConverterUtility.UpgradePrefab(context.item.descriptor.info, UpgradeGameObject);
  95. else if (ext == ".unity")
  96. URP2DConverterUtility.UpgradeScene(context.item.descriptor.info, UpgradeGameObject);
  97. else if (ext == ".mat")
  98. URP2DConverterUtility.UpgradeMaterial(context.item.descriptor.info, m_SpritesDefaultShader, m_SpriteLitDefaultShader);
  99. else if (ext == ".psb" || ext == ".psd")
  100. result = URP2DConverterUtility.UpgradePSB(context.item.descriptor.info);
  101. if (result != string.Empty)
  102. {
  103. context.didFail = true;
  104. context.info = result;
  105. }
  106. else
  107. {
  108. context.hasConverted = true;
  109. }
  110. }
  111. public override void OnClicked(int index)
  112. {
  113. EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(m_AssetsToConvert[index]));
  114. }
  115. public override void OnPostRun()
  116. {
  117. Resources.UnloadUnusedAssets();
  118. }
  119. }
  120. }