using UnityEngine; using UnityEngine.Rendering; namespace Flexalon.Samples { // Automatically selects the right material based on render pipeline and provides helpers for setting the color. [ExecuteAlways, AddComponentMenu("Flexalon Samples/Flexalon Dynamic Material")] public class FlexalonDynamicMaterial : MonoBehaviour { public Material Standard; public Material URP; public Material HDRP; [SerializeField] private Color _color = Color.white; public Color Color => _color; private MeshRenderer _meshRenderer; void OnEnable() { UpdateMeshRenderer(); if (_meshRenderer) { #if UNITY_6000_0_OR_NEWER var renderPipeline = GraphicsSettings.defaultRenderPipeline; #else var renderPipeline = GraphicsSettings.renderPipelineAsset; #endif if (renderPipeline?.GetType().Name.Contains("HDRenderPipelineAsset") ?? false) { _meshRenderer.sharedMaterial = HDRP; } else if (renderPipeline?.GetType().Name.Contains("UniversalRenderPipelineAsset") ?? false) { _meshRenderer.sharedMaterial = URP; } else { _meshRenderer.sharedMaterial = Standard; } SetColor(_color); } } private string GetColorPropertyName() { if (_meshRenderer.sharedMaterial.HasProperty("_BaseColor")) // HRDP.Lit / URP.Lit { return "_BaseColor"; } else if (_meshRenderer.sharedMaterial.HasProperty("_Color")) // Standard { return "_Color"; } return null; } public void SetColor(Color color) { _color = color; UpdateMeshRenderer(); if (_meshRenderer) { var propertyBlock = new MaterialPropertyBlock(); propertyBlock.SetColor(GetColorPropertyName(), color); _meshRenderer.SetPropertyBlock(propertyBlock); } } private void UpdateMeshRenderer() { if (_meshRenderer == null) { _meshRenderer = GetComponent(); } } } }