using System.Collections.Generic; using UnityEngine; [AddComponentMenu("Modifiers/Point Cache Animator")] [ExecuteInEditMode] public class MegaPointCacheAnimator : MonoBehaviour { public MegaPointCache mod; public MegaPointCacheRef modref; public List clips = new List(); public int current; public float t = -1f; public float at; public int sourceFPS = 30; public bool useFrames = true; public bool LinkedUpdate; public bool PlayOnStart = true; private Animation myanim; [ContextMenu("Help")] public void Help() { Application.OpenURL("http://www.west-racing.com/mf/?page_id=1802"); } public bool IsPlaying() { if (t >= 0f) { return true; } return false; } public void SetTime(float time) { t = time; } public float GetTime() { return at; } public void PlayClipEvent(int i) { PlayClip(i); } public void PlayClipNameEvent(string name) { PlayClip(name); } public void PlayClip(int i) { if (i < clips.Count) { current = i; t = 0f; } } public void PlayClip(string name) { for (int i = 0; i < clips.Count; i++) { if (clips[i].name == name) { current = i; t = 0f; break; } } } public void Stop() { t = -1f; } public int AddClip(string name, float start, float end, MegaRepeatMode loop) { MegaPointCacheAnimClip item = new MegaPointCacheAnimClip(name, start, end, loop); clips.Add(item); return clips.Count - 1; } public string[] GetClipNames() { string[] array = new string[clips.Count]; for (int i = 0; i < clips.Count; i++) { array[i] = clips[i].name; } return array; } private void Start() { if (PlayOnStart) { t = 0f; } else { t = -1f; } } private void Update() { DoUpdate(); } private void DoUpdate() { if (mod == null && modref == null) { mod = GetComponent(); modref = GetComponent(); } if (!(mod != null) && !(modref != null)) { return; } if (LinkedUpdate) { DoLinkedUpdate(); } else { if (clips.Count <= 0 || current >= clips.Count || !(t >= 0f)) { return; } t += Time.deltaTime * clips[current].speed; float num = clips[current].end - clips[current].start; switch (clips[current].loop) { case MegaRepeatMode.Loop: at = Mathf.Repeat(t, Mathf.Abs(num)); if (num < 0f) { at = clips[current].start - at; } break; case MegaRepeatMode.PingPong: at = Mathf.PingPong(t, num); break; case MegaRepeatMode.Clamp: at = Mathf.Clamp(t, 0f, num); break; } at += clips[current].start; if ((bool)mod) { mod.SetAnim(at); } else { modref.SetAnim(at); } } } private void DoLinkedUpdate() { if (myanim == null) { myanim = GetComponent(); } if (!(myanim != null)) { return; } foreach (AnimationState item in myanim) { if (!item.enabled) { continue; } AnimationClip clip = item.clip; if (!(clip != null)) { continue; } for (int i = 0; i < clips.Count; i++) { if (!(clips[i].name == clip.name)) { continue; } current = i; float num = item.time; if (clip.wrapMode == WrapMode.Default) { WrapMode wrapMode = myanim.wrapMode; } switch (clip.wrapMode) { case WrapMode.Loop: num = Mathf.Repeat(num, clip.length); break; case WrapMode.PingPong: num = Mathf.PingPong(num, clip.length); break; case WrapMode.ClampForever: num = Mathf.Clamp(num, 0f, clip.length); break; case WrapMode.Once: if (num > clip.length) { num = 0f; } break; } num += clips[current].start; if ((bool)mod) { mod.SetAnim(num); } else { modref.SetAnim(num); } return; } } } }