using UnityEngine; using MalbersAnimations.Scriptables; using System.Collections; namespace MalbersAnimations.Utilities { [CreateAssetMenu(menuName = "Malbers Animations/Extras/Material Lerp", order = 2100)] public class MaterialLerpSO : ScriptableCoroutine { [Tooltip("Next material to lerp to")] public Material ToMaterial; [Tooltip("Index of the Material")] public int materialIndex = 0; [Tooltip("Time to lerp the materials")] public FloatReference time = new FloatReference(1f); [Tooltip("Curve to apply to the lerping")] public AnimationCurve curve = new AnimationCurve(MTools.DefaultCurve); public virtual void Lerp(Renderer mesh) { StartCoroutine(mesh, Lerper(mesh,time,curve)); } public void Lerp(Component go) => Lerp(go.gameObject); public void Lerp(GameObject go) { var all = go.transform.root.GetComponentsInChildren(); var all2 = go.transform.root.GetComponentsInChildren(); foreach (var item in all) Lerp(item); foreach (var item in all2) Lerp(item); } public virtual void LerpForever(Renderer mesh) { StartCoroutine(mesh, LerperForever(mesh)); } internal override void Evaluate(MonoBehaviour mono, Transform target, float time, AnimationCurve curve) { mono.StartCoroutine(Lerper(target.GetComponent(), time, curve)); } private IEnumerator Lerper(Renderer mesh, float time, AnimationCurve curve) { float elapsedTime = 0; var rendererMaterial = mesh.sharedMaterials[materialIndex]; //get the Material from the renderer while (elapsedTime <= time) { float value = curve.Evaluate(elapsedTime / time); // mesh.SetPropertyBlock() mesh.material.Lerp(rendererMaterial, ToMaterial, value); elapsedTime += Time.deltaTime; yield return null; } mesh.material.Lerp(rendererMaterial, ToMaterial, curve.Evaluate(curve.keys[curve.keys.Length - 1].time)); yield return null; Stop(mesh); } IEnumerator LerperForever(Renderer mesh) { float elapsedTime = 0; var rendererMaterial = mesh.sharedMaterials[materialIndex]; //get the Material from the renderer while (true) { float value = curve.Evaluate((elapsedTime / time) % 1); mesh.material.Lerp(rendererMaterial, ToMaterial, value); elapsedTime += Time.deltaTime; yield return null; } } } }