139 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.IO; | ||
|  | using System.Collections.Generic; | ||
|  | using UnityEditor.Rendering.Universal; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Rendering.Universal; | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace UnityEditor.Rendering.Universal | ||
|  | { | ||
|  |     internal sealed class BuiltInToURP2DMaterialUpgrader : RenderPipelineConverter | ||
|  |     { | ||
|  |         public override string name => "Material and Material Reference Upgrade"; | ||
|  |         public override string info => "This will upgrade all materials and material references."; | ||
|  |         public override int priority => -1000; | ||
|  |         public override Type container => typeof(BuiltInToURP2DConverterContainer); | ||
|  | 
 | ||
|  |         List<string> m_AssetsToConvert = new List<string>(); | ||
|  | 
 | ||
|  |         Material m_SpriteLitDefaultMat; | ||
|  |         Material m_SpritesDefaultMat; | ||
|  |         Material m_SpritesMaskMat; | ||
|  |         Material m_SpriteMaskDefaultMat; | ||
|  |         Shader m_SpriteLitDefaultShader; | ||
|  |         Shader m_SpritesDefaultShader; | ||
|  | 
 | ||
|  |         string m_SpritesDefaultShaderId; | ||
|  |         string m_SpritesDefaultMatId; | ||
|  |         string m_SpritesMaskMatId; | ||
|  | 
 | ||
|  |         void UpgradeGameObject(GameObject go) | ||
|  |         { | ||
|  |             Renderer[] renderers = go.GetComponentsInChildren<Renderer>(); | ||
|  |             foreach (Renderer renderer in renderers) | ||
|  |             { | ||
|  |                 if (!PrefabUtility.IsPartOfPrefabInstance(renderer)) | ||
|  |                 { | ||
|  |                     int materialCount = renderer.sharedMaterials.Length; | ||
|  |                     Material[] newMaterials = new Material[materialCount]; | ||
|  |                     bool updateMaterials = false; | ||
|  | 
 | ||
|  |                     for (int matIndex = 0; matIndex < materialCount; matIndex++) | ||
|  |                     { | ||
|  |                         if (renderer.sharedMaterials[matIndex] == m_SpritesDefaultMat) | ||
|  |                         { | ||
|  |                             newMaterials[matIndex] = m_SpriteLitDefaultMat; | ||
|  |                             updateMaterials = true; | ||
|  |                         } | ||
|  |                         else if (renderer.sharedMaterials[matIndex] == m_SpritesMaskMat) | ||
|  |                         { | ||
|  |                             newMaterials[matIndex] = m_SpriteMaskDefaultMat; | ||
|  |                             updateMaterials = true; | ||
|  |                         } | ||
|  |                         else | ||
|  |                             newMaterials[matIndex] = renderer.sharedMaterials[matIndex]; | ||
|  |                     } | ||
|  | 
 | ||
|  |                     if (updateMaterials) | ||
|  |                         renderer.sharedMaterials = newMaterials; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnInitialize(InitializeConverterContext context, Action callback) | ||
|  |         { | ||
|  |             Renderer2DData data = Light2DEditorUtility.GetRenderer2DData(); | ||
|  |             if (data != null) | ||
|  |                 m_SpriteLitDefaultMat = data.GetDefaultMaterial(DefaultMaterialType.Sprite); | ||
|  |             else | ||
|  |                 m_SpriteLitDefaultMat = AssetDatabase.LoadAssetAtPath<Material>("Packages/com.unity.render-pipelines.universal/Runtime/Materials/Sprite-Lit-Default.mat"); | ||
|  | 
 | ||
|  |             m_SpritesDefaultMat = AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Default.mat"); | ||
|  |             m_SpriteMaskDefaultMat = AssetDatabase.LoadAssetAtPath<Material>("Packages/com.unity.render-pipelines.universal/Runtime/Materials/SpriteMask-Default.mat"); | ||
|  |             m_SpritesMaskMat = AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Mask.mat"); | ||
|  |             m_SpriteLitDefaultShader = m_SpriteLitDefaultMat.shader; | ||
|  |             m_SpritesDefaultShader = m_SpritesDefaultMat.shader; | ||
|  |             m_SpritesDefaultShaderId = URP2DConverterUtility.GetObjectIDString(m_SpritesDefaultShader); | ||
|  |             m_SpritesDefaultMatId = URP2DConverterUtility.GetObjectIDString(m_SpritesDefaultMat); | ||
|  |             m_SpritesMaskMatId = URP2DConverterUtility.GetObjectIDString(m_SpritesMaskMat); | ||
|  | 
 | ||
|  |             string[] allAssetPaths = AssetDatabase.GetAllAssetPaths(); | ||
|  | 
 | ||
|  |             foreach (string path in allAssetPaths) | ||
|  |             { | ||
|  |                 if (URP2DConverterUtility.IsPSB(path) ||  URP2DConverterUtility.IsMaterialPath(path, m_SpritesDefaultShaderId) || URP2DConverterUtility.IsPrefabOrScenePath(path, new string[] { m_SpritesDefaultMatId, m_SpritesMaskMatId })) | ||
|  |                 { | ||
|  |                     ConverterItemDescriptor desc = new ConverterItemDescriptor() | ||
|  |                     { | ||
|  |                         name = Path.GetFileNameWithoutExtension(path), | ||
|  |                         info = path, | ||
|  |                         warningMessage = String.Empty, | ||
|  |                         helpLink = String.Empty | ||
|  |                     }; | ||
|  | 
 | ||
|  |                     // Each converter needs to add this info using this API. | ||
|  |                     m_AssetsToConvert.Add(path); | ||
|  |                     context.AddAssetToConvert(desc); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             callback.Invoke(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnRun(ref RunItemContext context) | ||
|  |         { | ||
|  |             string result = string.Empty; | ||
|  |             string ext = Path.GetExtension(context.item.descriptor.info); | ||
|  |             if (ext == ".prefab") | ||
|  |                 result = URP2DConverterUtility.UpgradePrefab(context.item.descriptor.info, UpgradeGameObject); | ||
|  |             else if (ext == ".unity") | ||
|  |                 URP2DConverterUtility.UpgradeScene(context.item.descriptor.info, UpgradeGameObject); | ||
|  |             else if (ext == ".mat") | ||
|  |                 URP2DConverterUtility.UpgradeMaterial(context.item.descriptor.info, m_SpritesDefaultShader, m_SpriteLitDefaultShader); | ||
|  |             else if (ext == ".psb" || ext == ".psd") | ||
|  |                 result = URP2DConverterUtility.UpgradePSB(context.item.descriptor.info); | ||
|  | 
 | ||
|  |             if (result != string.Empty) | ||
|  |             { | ||
|  |                 context.didFail = true; | ||
|  |                 context.info = result; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 context.hasConverted = true; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnClicked(int index) | ||
|  |         { | ||
|  |             EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(m_AssetsToConvert[index])); | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnPostRun() | ||
|  |         { | ||
|  |             Resources.UnloadUnusedAssets(); | ||
|  |         } | ||
|  |     } | ||
|  | } |