浮点值的变化
public class FloatInterpolator
{
private Material material;
private string name;
private float startValue;
private float targetValue;
private float duration;
private float elapsedTime;
public float CurrentValue { get; private set; }
public bool IsInterpolating { get; private set; }
public FloatInterpolator(Material mat, string name, float targetValue, float duration)
{
this.material = mat;
this.name = name;
this.startValue = mat.GetFloat(name);
this.targetValue = targetValue;
this.duration = duration;
elapsedTime = 0f;
CurrentValue = startValue;
IsInterpolating = false;
}
public void StartInterpolation()
{
if (duration <= 0f)
{
CurrentValue = targetValue;
IsInterpolating = false;
}
else
{
elapsedTime = 0f;
IsInterpolating = true;
}
}
public void UpdateInterpolation()
{
if (!IsInterpolating)
return;
elapsedTime += Time.deltaTime;
if (elapsedTime >= duration)
{
CurrentValue = targetValue;
IsInterpolating = false;
}
else
{
float t = elapsedTime / duration;
CurrentValue = Mathf.Lerp(startValue, targetValue, t);
material.SetFloat(name, CurrentValue);
}
}
}
颜色的变化
public class ColorInterpolator
{
private Material material;
private string name;
private Color startValue;
private Color targetValue;
private float duration;
private float elapsedTime;
public Color CurrentValue { get; private set; }
public bool IsInterpolating { get; private set; }
public ColorInterpolator(Material mat, string name, Color targetValue, float duration)
{
this.name = name;
this.material = mat;
this.startValue = mat.GetColor(name);
this.targetValue = targetValue;
this.duration = duration;
elapsedTime = 0f;
CurrentValue = startValue;
IsInterpolating = false;
}
public void StartInterpolation()
{
if (duration <= 0f)
{
CurrentValue = targetValue;
IsInterpolating = false;
}
else
{
elapsedTime = 0f;
IsInterpolating = true;
}
}
public void UpdateInterpolation()
{
if (!IsInterpolating)
return;
elapsedTime += Time.deltaTime;
if (elapsedTime >= duration)
{
CurrentValue = targetValue;
IsInterpolating = false;
}
else
{
float t = elapsedTime / duration;
float r = Mathf.Lerp(startValue.r, targetValue.r, t);
float g = Mathf.Lerp(startValue.g, targetValue.g, t);
float b = Mathf.Lerp(startValue.b, targetValue.b, t);
float a = Mathf.Lerp(startValue.a, targetValue.a, t);
CurrentValue = new Color(r, g, b, a);
material.SetColor(name, CurrentValue);
}
}
}
调用方法: 多个参数 或者多个颜色 需要加入列表,通过遍历来实现插值变换
private List<FloatInterpolator> interpolators;
private ColorInterpolator colorinterpolator;
public void Update()
{
if (interpolators.Count != 0)
{
foreach (FloatInterpolator item in interpolators)
{
item.UpdateInterpolation();
}
}
if (colorinterpolator != null)
{
colorinterpolator.UpdateInterpolation();
}
}
public void DoMat(Material material){
interpolators.Clear();
FloatInterpolator interpolator1 = new FloatInterpolator(getCurMat(), "_Emission", material.GetFloat("_Emission"), 3);
FloatInterpolator interpolator2 = new FloatInterpolator(getCurMat(), "_Metalic", material.GetFloat("_Metalic"), 3);
interpolators.Add(interpolator1);
interpolators.Add(interpolator2);
colorinterpolator = null;
colorinterpolator = new ColorInterpolator(getCurMat(), "_Color", material.GetColor("_Color"), 3);
foreach (FloatInterpolator item in interpolators)
{
item.StartInterpolation();
}
colorinterpolator.StartInterpolation();
}
getCurMat()方法是返回需要变化的材质,DoMat中传入的参数是变化的最终结果的材质。