Files
Main/Assets/Launcher/ExternalLibs/GrassCombine/VertexAnimate/VertexAnimateBaseScript.cs
2025-01-25 04:38:09 +08:00

129 lines
3.2 KiB
C#

using UnityEngine;
namespace Thousandto.Launcher.ExternalLibs
{
/// <summary>
/// 子节点网格的脚本
/// 此脚本只保存了,RuntimeMesh的一个对象
/// 可以被其他脚本用于来进行顶点修改
/// </summary>
public class VertexAnimateBaseScript : MonoBehaviour
{
#region //私有变量
[SerializeField]
private ChildMeshDataScript _script = null;
//记录回调函数
private SetNewVertexDelegate _setNewVertexHandler = null;
//记录当前帧增加的顶点值分量
private Vector3 _datV = Vector3.zero;
//开始进行动画
private bool _playing = false;
#endregion
#region//属性
//顶点的增加分量
public Vector3 DatVectex
{
get { return _datV; }
set { _datV = value; }
}
//是否正在播放
public bool Playing
{
get { return _playing; }
}
#endregion
#region//公共函数
public void SetRunTimeScript(ChildMeshDataScript script)
{
_script = script;
}
#endregion
#region //重写继承MonoBehaviour方法
//开始
private void Start()
{
OnStart();
}
//更新
private void Update()
{
if (_playing )
{
RefreshVertex();
}
}
private void OnDestroy()
{
}
//刷新顶点
private void RefreshVertex()
{
if (_setNewVertexHandler != null && _script.ChildMeshInfo != null && _script.enabled)
{
if (OnRefreshVertexBefore(ref _datV))
{
_script.ChildMeshInfo.RefreshVertex(_setNewVertexHandler);
OnRefreshVertexAfter(ref _datV);
}
}
}
#endregion
#region//虚函数,有子类进行调用
protected virtual void OnStart()
{
_setNewVertexHandler = OnSetNewVertexHandler;
}
//刷新顶点之前这里对顶点的每个分量做增量结算
protected virtual bool OnRefreshVertexBefore(ref Vector3 datVertex)
{
datVertex.Set(0, 0, 0);
return false;
}
//刷新顶点完成后做其他处理
protected virtual void OnRefreshVertexAfter(ref Vector3 datVertex)
{
}
//设置新顶点的Handler处理
protected virtual void OnSetNewVertexHandler(ref Vector3 newV, ref Vector3 oldV, ref Color vcolor)
{
newV.x = oldV.x + _datV.x * vcolor.a;
newV.y = oldV.y + _datV.y * vcolor.a;
newV.z = oldV.z + _datV.z * vcolor.a;
}
//播放
protected virtual void Play()
{
_playing = true;
}
//停止
protected virtual void Stop()
{
_playing = false;
_datV.Set(0, 0, 0);
if(_script.ChildMeshInfo != null && _script.enabled)
_script.ChildMeshInfo.RefreshVertex(_setNewVertexHandler);
}
#endregion
}
}