using UnityEngine; namespace Thousandto.Launcher.ExternalLibs { /// /// 子节点网格的脚本 /// 此脚本只保存了,RuntimeMesh的一个对象 /// 可以被其他脚本用于来进行顶点修改 /// 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 } }