using BitStrap; using UnityEngine; public class FishPartAnim : MonoBehaviour { public FishPartAnimParent fishPartAnimParent; public float duration = 0.3f; public float durationShakeFactor = 0.15f; public bool updatePosition; public bool useX = true; public bool useY = true; public bool useZ = true; public Vector3 startRotation = Vector3.zero; public Vector3 finishRotation = Vector3.zero; public AnimationCurve curve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); [ReadOnly] public float currentDuration = 0.3f; [ReadOnly] public float timer; [ReadOnly] public float direction = 1f; public bool useMultiplier = true; public float multiplier = 1f; [Space(10f)] public bool unscaledTime = true; public bool updateInEditor; public float fakeValue; private double lastTime; [HideInInspector] public FishAnimationController fishAnimationController; private void Start() { if (Application.isPlaying || updateInEditor) { SetStartValue(true); currentDuration = duration; } } private void Update() { if ((!Application.isPlaying && !updateInEditor) || ((bool)fishPartAnimParent && (!fishPartAnimParent.enabled || fishPartAnimParent.currentDuration == 0f))) { return; } Vector3 zero = Vector3.zero; if ((bool)fishPartAnimParent) { zero = Vector3.Lerp(startRotation, finishRotation, curve.Evaluate(fishPartAnimParent.timer / fishPartAnimParent.currentDuration)) * ((!useMultiplier) ? 1f : fishPartAnimParent.currentMultiplier); } else { if (Application.isPlaying) { if (Time.unscaledDeltaTime < 1f) { if (unscaledTime) { timer += direction * Time.unscaledDeltaTime; } else { timer += direction * Time.deltaTime; } } } else if (!updateInEditor) { } zero = Vector3.Lerp(startRotation, finishRotation * ((!useMultiplier) ? 1f : multiplier), curve.Evaluate(timer / currentDuration)); if ((timer > currentDuration && direction > 0f) || (timer < 0f && direction < 0f)) { timer = Mathf.Clamp(timer, 0f, currentDuration); direction *= -1f; currentDuration = duration + Random.Range((0f - duration) * durationShakeFactor, duration * durationShakeFactor); } } if (!useX) { zero.x = ((!updatePosition) ? base.transform.localEulerAngles.x : base.transform.localPosition.x); } if (!useY) { zero.y = ((!updatePosition) ? base.transform.localEulerAngles.y : base.transform.localPosition.y); } if (!useZ) { zero.z = ((!updatePosition) ? base.transform.localEulerAngles.z : base.transform.localPosition.z); } if (updatePosition) { base.transform.localPosition = zero; } else { base.transform.localEulerAngles = zero; } } [Button] public void ResetRotation() { startRotation = (finishRotation = ((!updatePosition) ? base.transform.localEulerAngles : base.transform.localPosition)); } public void Reset() { timer = 0f; } public void SetStartValue(bool start) { Vector3 zero = Vector3.zero; zero = ((!updatePosition) ? ((!start) ? finishRotation : startRotation) : ((!start) ? finishRotation : startRotation)); if (!useX) { zero.x = ((!updatePosition) ? base.transform.localEulerAngles.x : base.transform.localPosition.x); } if (!useY) { zero.y = ((!updatePosition) ? base.transform.localEulerAngles.y : base.transform.localPosition.y); } if (!useZ) { zero.z = ((!updatePosition) ? base.transform.localEulerAngles.z : base.transform.localPosition.z); } if (updatePosition) { base.transform.localPosition = zero; } else { base.transform.localEulerAngles = zero; } } }