110 lines
2.6 KiB
C#
110 lines
2.6 KiB
C#
using UnityEngine;
|
||
|
||
public class FlipbookAnimationStarter : MonoBehaviour
|
||
{
|
||
[Header("设置")]
|
||
[Tooltip("是否在OnEnable时自动设置StartTime")]
|
||
public bool autoSetOnEnable = true;
|
||
|
||
[Tooltip("使用 MaterialPropertyBlock(推荐,支持GPU Instancing)还是Material实例")]
|
||
public bool usePropertyBlock = true;
|
||
|
||
[Tooltip("是否也处理子对象的Renderer")]
|
||
public bool includeChildren = false;
|
||
|
||
private static readonly int StartTimePropertyID = Shader.PropertyToID("_StartTime");
|
||
private MaterialPropertyBlock _propertyBlock;
|
||
private Renderer[] _renderers;
|
||
|
||
private void Awake()
|
||
{
|
||
if (usePropertyBlock)
|
||
{
|
||
_propertyBlock = new MaterialPropertyBlock();
|
||
}
|
||
|
||
if (includeChildren)
|
||
{
|
||
_renderers = GetComponentsInChildren<Renderer>(true);
|
||
}
|
||
else
|
||
{
|
||
var renderer = GetComponent<Renderer>();
|
||
_renderers = renderer != null ? new[] { renderer } : new Renderer[0];
|
||
}
|
||
}
|
||
|
||
private void OnEnable()
|
||
{
|
||
if (autoSetOnEnable)
|
||
{
|
||
SetStartTime();
|
||
}
|
||
}
|
||
|
||
public void SetStartTime()
|
||
{
|
||
SetStartTime(Time.time);
|
||
}
|
||
|
||
public void SetStartTime(float startTime)
|
||
{
|
||
foreach (var renderer in _renderers)
|
||
{
|
||
if (renderer == null) continue;
|
||
|
||
if (usePropertyBlock)
|
||
{
|
||
renderer.GetPropertyBlock(_propertyBlock);
|
||
_propertyBlock.SetFloat(StartTimePropertyID, startTime);
|
||
renderer.SetPropertyBlock(_propertyBlock);
|
||
}
|
||
else
|
||
{
|
||
renderer.material.SetFloat(StartTimePropertyID, startTime);
|
||
}
|
||
}
|
||
}
|
||
|
||
public void ResetAnimation()
|
||
{
|
||
SetStartTime(0f);
|
||
}
|
||
|
||
public void RestartAnimation()
|
||
{
|
||
SetStartTime(Time.time);
|
||
}
|
||
|
||
#if UNITY_EDITOR
|
||
[ContextMenu("设置StartTime为当前时间")]
|
||
private void EditorSetStartTime()
|
||
{
|
||
if (Application.isPlaying)
|
||
{
|
||
SetStartTime();
|
||
Debug.Log($"已设置 {gameObject.name} 的StartTime为 {Time.time}");
|
||
}
|
||
else
|
||
{
|
||
Debug.LogWarning("请在运行时执行此操作");
|
||
}
|
||
}
|
||
|
||
[ContextMenu("重置StartTime为0")]
|
||
private void EditorResetStartTime()
|
||
{
|
||
if (Application.isPlaying)
|
||
{
|
||
ResetAnimation();
|
||
Debug.Log($"已重置 {gameObject.name} 的StartTime为0");
|
||
}
|
||
else
|
||
{
|
||
Debug.LogWarning("请在运行时执行此操作");
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|