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.

227 lines
7.8 KiB
C#

using UnityEngine;
using System.Collections;
using MalbersAnimations.Scriptables;
using System.Collections.Generic;
namespace MalbersAnimations.Utilities
{
[CreateAssetMenu(menuName = "Malbers Animations/Extras/Material Property Lerp", order = 2100)]
public class MaterialPropertyLerpSO : ScriptableCoroutine
{
[Tooltip("Index of the Material")]
public IntReference materialIndex = new IntReference();
public FloatReference time = new FloatReference(1f);
public AnimationCurve curve = new AnimationCurve(MTools.DefaultCurve);
public StringReference propertyName;
public MaterialPropertyType propertyType = MaterialPropertyType.Float;
public FloatReference FloatValue = new FloatReference(1f);
public Color ColorValue = Color.white;
[ColorUsage(true, true)]
public Color ColorHDRValue = Color.white;
public FloatReference StartMultiplier = new FloatReference(1f);
public void LerpMaterial(Component go) => LerpMaterial(go.gameObject);
public void LerpMaterial(GameObject go)
{
var all = go.transform.root.GetComponentsInChildren<SkinnedMeshRenderer>();
var all2 = go.transform.root.GetComponentsInChildren<MeshRenderer>();
foreach (var item in all) LerpMaterial(item);
foreach (var item in all2) LerpMaterial(item);
}
internal override void Evaluate(MonoBehaviour mono, Transform target, float time, AnimationCurve curve = null)
{
var t = target.GetComponent<MeshRenderer>();
var curv = curve != null ? curve : this.curve;
switch (propertyType)
{
case MaterialPropertyType.Float:
mono.StartCoroutine(LerperFloat(t,time, curv));
break;
case MaterialPropertyType.Color:
mono.StartCoroutine(LerperColor(t, ColorValue, time, curv));
break;
case MaterialPropertyType.HDRColor:
mono.StartCoroutine(LerperColor(t, ColorHDRValue, time, curv));
break;
default:
break;
}
}
[System.Obsolete("Lerp is Obsolete, use LerpMaterial(Renderer) instead")]
public virtual void Lerp(Renderer mesh) => LerpMaterial(mesh);
public virtual void LerpMaterial(Renderer mesh)
{
if (mesh)
{
IEnumerator ICoroutine = null;
switch (propertyType)
{
case MaterialPropertyType.Float:
ICoroutine = LerperFloat(mesh, time, curve);
break;
case MaterialPropertyType.Color:
ICoroutine = LerperColor(mesh, ColorValue, time, curve);
break;
case MaterialPropertyType.HDRColor:
ICoroutine = LerperColor(mesh, ColorHDRValue, time, curve);
break;
default:
break;
}
StartCoroutine(mesh, ICoroutine);
}
}
IEnumerator LerperFloat(Renderer mesh, float time, AnimationCurve curve)
{
float elapsedTime = 0;
var mat = mesh.materials[materialIndex];
while (elapsedTime <= time)
{
float value = curve.Evaluate(elapsedTime / time);
mat.SetFloat(propertyName, value * FloatValue);
Debug.Log("value = " + value);
elapsedTime += Time.deltaTime;
yield return null;
}
mat.SetFloat(propertyName, curve.Evaluate(curve.keys[curve.keys.Length - 1].time));
yield return null;
Stop(mesh);
}
IEnumerator LerperColor(Renderer mesh, Color FinalColor, float time, AnimationCurve curve)
{
float elapsedTime = 0;
var mat = mesh.materials[materialIndex];
Color StartingColor = mat.GetColor(propertyName)* StartMultiplier;
Color ElapsedColor;// = Color.LerpUnclamped(StartingColor, FinalColor, curve.Evaluate(curve.keys[curve.keys.Length - 1].time));
if (time > 0)
{
while (elapsedTime <= time)
{
float value = curve.Evaluate(elapsedTime / time);
ElapsedColor = Color.LerpUnclamped(StartingColor, FinalColor, value);
mat.SetColor(propertyName, ElapsedColor);
elapsedTime += Time.deltaTime;
yield return null;
}
}
ElapsedColor = Color.LerpUnclamped(StartingColor, FinalColor, curve.Evaluate(1));
mat.SetColor(propertyName, ElapsedColor);
yield return null;
Stop(mesh);
}
}
[System.Serializable]
public class MaterialPropertyInternal
{
public string propertyName;
public MaterialPropertyType propertyType = MaterialPropertyType.Float;
public float FloatValue = 1f;
public Color ColorValue = Color.white;
[ColorUsage(true, true)]
public Color ColorHDRValue = Color.white;
[HideInInspector] public bool isFloat;
[HideInInspector] public bool isColor;
[HideInInspector] public bool isColorHDR;
}
public enum MaterialPropertyType
{
Float,
Color,
HDRColor
}
//Inspector
#if UNITY_EDITOR
[UnityEditor.CustomEditor(typeof(MaterialPropertyLerpSO)),UnityEditor.CanEditMultipleObjects]
public class MaterialPropertyLerpSOEditor : UnityEditor.Editor
{
UnityEditor.SerializedProperty propertyName, materialIndex, propertyType, time, FloatValue, ColorValue, ColorHDRValue, ColorMultiplier, curve;//, UseMaterialPropertyBlock, shared;
private void OnEnable()
{
propertyName = serializedObject.FindProperty("propertyName");
materialIndex = serializedObject.FindProperty("materialIndex");
propertyType = serializedObject.FindProperty("propertyType");
time = serializedObject.FindProperty("time");
FloatValue = serializedObject.FindProperty("FloatValue");
ColorValue = serializedObject.FindProperty("ColorValue");
ColorHDRValue = serializedObject.FindProperty("ColorHDRValue");
ColorMultiplier = serializedObject.FindProperty("StartMultiplier");
curve = serializedObject.FindProperty("curve");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
UnityEditor.EditorGUILayout.PropertyField(propertyName);
UnityEditor.EditorGUILayout.PropertyField(materialIndex);
UnityEditor.EditorGUILayout.PropertyField(time);
UnityEditor.EditorGUILayout.PropertyField(propertyType);
var pType = (MaterialPropertyType)propertyType.intValue;
switch (pType)
{
case MaterialPropertyType.Float:
UnityEditor.EditorGUILayout.PropertyField(FloatValue);
break;
case MaterialPropertyType.Color:
UnityEditor.EditorGUILayout.PropertyField(ColorValue);
UnityEditor.EditorGUILayout.PropertyField(ColorMultiplier);
break;
case MaterialPropertyType.HDRColor:
UnityEditor.EditorGUILayout.PropertyField(ColorHDRValue);
UnityEditor.EditorGUILayout.PropertyField(ColorMultiplier);
break;
default:
break;
}
UnityEditor.EditorGUILayout.PropertyField(curve);
serializedObject.ApplyModifiedProperties();
}
}
#endif
}