You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
 | 
						|
#if UNITY_EDITOR && UNITY_URP
 | 
						|
using UnityEditor;
 | 
						|
#endif
 | 
						|
 | 
						|
[ExecuteInEditMode]
 | 
						|
public class URPMaterialSwitcher : MonoBehaviour
 | 
						|
{
 | 
						|
	public bool children = false;
 | 
						|
 | 
						|
#if UNITY_EDITOR && UNITY_URP
 | 
						|
 | 
						|
	private const string searchTemplate = "URP{0} t:material";
 | 
						|
	void Start()
 | 
						|
	{
 | 
						|
		Renderer renderer;
 | 
						|
 | 
						|
		if (children)
 | 
						|
			renderer = this.GetComponentInChildren<Renderer>();
 | 
						|
		else
 | 
						|
			renderer = this.GetComponent<Renderer>();
 | 
						|
 | 
						|
		if (renderer.sharedMaterial.name.StartsWith("URP") == false)
 | 
						|
		{
 | 
						|
			string[] mats = UnityEditor.AssetDatabase.FindAssets(string.Format(searchTemplate, renderer.sharedMaterial.name));
 | 
						|
			if (mats.Length > 0)
 | 
						|
			{
 | 
						|
				string path = UnityEditor.AssetDatabase.GUIDToAssetPath(mats[0]);
 | 
						|
 | 
						|
				if (PrefabUtility.IsPartOfPrefabInstance(this))
 | 
						|
				{
 | 
						|
					string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(this);
 | 
						|
					GameObject myPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
 | 
						|
					URPMaterialSwitcher[] switchers = myPrefab.GetComponentsInChildren<URPMaterialSwitcher>(true);
 | 
						|
					foreach (var switcher in switchers)
 | 
						|
					{
 | 
						|
						switcher.Execute();
 | 
						|
					}
 | 
						|
					EditorUtility.SetDirty(myPrefab);
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					this.Execute();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public void Execute()
 | 
						|
	{
 | 
						|
		if (children)
 | 
						|
		{
 | 
						|
			Renderer[] renderers = this.GetComponentsInChildren<Renderer>();
 | 
						|
			foreach (var renderer in renderers)
 | 
						|
				SwitchRenderer(renderer);
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			SwitchRenderer(this.GetComponent<Renderer>());
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	private void SwitchRenderer(Renderer renderer)
 | 
						|
	{ 
 | 
						|
		if (renderer != null && renderer.sharedMaterial.name.StartsWith("URP") == false)
 | 
						|
		{
 | 
						|
			string[] foundMaterials = UnityEditor.AssetDatabase.FindAssets(string.Format(searchTemplate, renderer.sharedMaterial.name));
 | 
						|
			if (foundMaterials.Length > 0)
 | 
						|
			{
 | 
						|
				string urpMaterialPath = UnityEditor.AssetDatabase.GUIDToAssetPath(foundMaterials[0]);
 | 
						|
				Material urpMaterial = UnityEditor.AssetDatabase.LoadAssetAtPath<Material>(urpMaterialPath);
 | 
						|
 | 
						|
				SerializedObject serializedRenderer = new SerializedObject(renderer);
 | 
						|
				serializedRenderer.Update();
 | 
						|
 | 
						|
				SerializedProperty materialProp = serializedRenderer.FindProperty("m_Materials");
 | 
						|
				materialProp.ClearArray();
 | 
						|
				materialProp.InsertArrayElementAtIndex(0);
 | 
						|
				materialProp.GetArrayElementAtIndex(0).objectReferenceValue = urpMaterial;
 | 
						|
 | 
						|
				serializedRenderer.ApplyModifiedProperties();
 | 
						|
				if (PrefabUtility.IsPartOfPrefabInstance(renderer))
 | 
						|
				{
 | 
						|
					PrefabUtility.RecordPrefabInstancePropertyModifications(renderer);
 | 
						|
					UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(this.gameObject.scene);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
#endif
 | 
						|
}
 |