Files
yaoyanwei 2f2a601227 init
2025-08-04 16:45:48 +08:00

116 lines
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace TcgEngine.FX
{
/// <summary>
/// Useful tool to define animation sequences on materials
/// </summary>
public class AnimMatFX : MonoBehaviour
{
private Material target;
private float timer = 0f;
private float start_val;
private float current_val;
private AnimMatAction current = null;
private Queue<AnimMatAction> sequence = new Queue<AnimMatAction>();
void Start()
{
}
void Update()
{
if (target == null)
return;
if (current == null && sequence.Count > 0)
{
current = sequence.Dequeue();
start_val = target.GetFloat(current.target_name);
current_val = start_val;
timer = 0f;
}
if (current != null)
{
if (timer < current.duration)
{
timer += Time.deltaTime;
if (current.type == AnimMatActionType.Float)
{
float dist = Mathf.Abs(current.target_value - start_val);
float speed = dist / Mathf.Max(current.duration, 0.01f);
current_val = Mathf.MoveTowards(current_val, current.target_value, speed * Time.deltaTime);
target.SetFloat(current.target_name, current_val);
}
}
else
{
current.callback?.Invoke();
current = null;
}
}
}
public void SetFloat(string name, float value, float duration)
{
AnimMatAction action = new AnimMatAction();
action.type = AnimMatActionType.Float;
action.duration = duration;
action.target_name = name;
action.target_value = value;
sequence.Enqueue(action);
}
public void Callback(float duration, UnityAction callback)
{
AnimMatAction action = new AnimMatAction();
action.type = AnimMatActionType.None;
action.duration = duration;
action.callback = callback;
sequence.Enqueue(action);
}
public void Clear()
{
target = null;
timer = 0f;
sequence.Clear();
}
public static AnimMatFX Create(GameObject obj, Material target)
{
AnimMatFX anim = obj.GetComponent<AnimMatFX>();
if (anim == null)
anim = obj.AddComponent<AnimMatFX>();
anim.Clear();
anim.target = target;
return anim;
}
}
public enum AnimMatActionType
{
None = 0,
Float = 5,
}
public class AnimMatAction
{
public AnimMatActionType type;
public string target_name;
public float target_value;
public float duration = 1f;
public UnityAction callback = null;
}
}