Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/MegaPointCacheAnimator.cs
2026-02-21 16:45:37 +08:00

242 lines
3.8 KiB
C#

using System.Collections.Generic;
using UnityEngine;
[AddComponentMenu("Modifiers/Point Cache Animator")]
[ExecuteInEditMode]
public class MegaPointCacheAnimator : MonoBehaviour
{
public MegaPointCache mod;
public MegaPointCacheRef modref;
public List<MegaPointCacheAnimClip> clips = new List<MegaPointCacheAnimClip>();
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<MegaPointCache>();
modref = GetComponent<MegaPointCacheRef>();
}
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<Animation>();
}
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;
}
}
}
}