using System.Collections; using System.Collections.Generic; using BitStrap; using UnityEngine; public class FishAnimationController : MonoBehaviour { public enum AnimType { SWIM = 0, PULL = 1, WATCH = 2, TRYING_BAIT = 3, NONE = 4 } [ReadOnly] public AnimType currentAnimType = AnimType.NONE; public FishAnimSwim fishAnimSwim; public FishAnimSwim fishAnimPull; public List fishWatchAnims = new List(); public FishPartAnim mouth; public List fishWatchAnimParts = new List(); [ReadOnly] public float squirmTimer; [HideInInspector] public Fish fish; [HideInInspector] public Animator animator; private void Awake() { } public void Initialize() { fish = GetComponent(); animator = fish.modelRig.GetComponent(); if ((bool)fishAnimSwim) { fishAnimSwim.fish = fish; } if ((bool)fishAnimPull) { fishAnimPull.fish = fish; } currentAnimType = AnimType.NONE; ChangeAnimation(AnimType.SWIM); } public void ChangeAnimation(AnimType animType) { if (currentAnimType != animType) { if ((bool)fishAnimSwim) { fishAnimSwim.TurnOn(true); } if ((bool)fishAnimPull) { fishAnimPull.TurnOn(false); } if (fishWatchAnims.Count > 0) { fishWatchAnims[0].enabled = false; } fish.isTryingBait = animType == AnimType.TRYING_BAIT; StartWatchFish(animType == AnimType.WATCH); if ((bool)mouth) { mouth.enabled = animType == AnimType.WATCH || animType == AnimType.TRYING_BAIT; } else { Debug.LogError("No mouth in fish :" + base.name); } currentAnimType = animType; } } public void SwimAnimationUpdate() { if (fish == null) { Initialize(); } if (fish.isWatchingFish || fish.isInNetArea) { squirmTimer -= Time.deltaTime; if (squirmTimer <= 0f) { float num = Random.Range(0.2f, 0.3f); if (fish.isWatchingFish) { squirmTimer = Random.Range(3f, 10f); num *= fish.Strength; } else { squirmTimer = Random.Range(7f, 12f); num *= 10f; } StartCoroutine(fish.animController.Squirm(num)); } } else if (fish.bt.enabled && (bool)fishAnimSwim) { float angle180Range = Utilities.GetAngle180Range(fish.targetLookRotation.y); angle180Range = Mathf.Clamp(angle180Range, 0f - fish.fishMaxAngle, fish.fishMaxAngle); angle180Range = ((!fish.isFighting) ? Mathf.MoveTowards(fish.currentLookRotation.y, angle180Range, 160f * Time.deltaTime) : Mathf.MoveTowards(fish.currentLookRotation.y, angle180Range, 250f * Time.deltaTime)); if (Mathf.Abs(angle180Range) < 0.5f) { angle180Range = 0f; } fish.currentLookRotation.y = angle180Range; fishAnimSwim.SetRotationAngle(angle180Range * 4f); } } public IEnumerator Squirm(float strength) { float leanTime = 1f; LeanTween.value(0f, 1f, leanTime).setOnUpdate(delegate(float val) { if (fish.isWatchingFish) { fishAnimSwim.currentWatchFishSpeed = val; } else if (fish.isInNetArea) { fishAnimSwim.currentWatchFishSpeed = val; } else if (!fish.isFighting) { } }); AudioController.Play("SplashFish_01", Mathf.Lerp(0.5f, 1f, Mathf.InverseLerp(0.1f, 5f, fish.Length))); yield return new WaitForSeconds(leanTime); if (fish.isWatchingFish && fish.fishingPlayer.currentWatchStyle != Fish.WatchStyle.HANDS) { fish.fishingPlayer.WaterSplash(strength * 1f, 1f); } else if (!fish.isInNetArea) { } if (fish.isInNetArea && !fish.isWatchingFish) { fish.particleSwim.Play(); } yield return new WaitForSeconds(strength * 1f); LeanTween.value(1f, 0f, leanTime).setOnUpdate(delegate(float val) { if (fish.isWatchingFish) { fishAnimSwim.currentWatchFishSpeed = val; } else if (fish.isInNetArea) { fishAnimSwim.currentWatchFishSpeed = val; } else if (!fish.isFighting) { } }); fish.particleSwim.Stop(); } [Button] public void ToggleMouth() { OpenMouth(Random.Range(0, 2) > 0); } public void OpenMouth(bool open) { if (!(mouth == null)) { mouth.SetStartValue(open); } } public void StartWatchFish(bool animate) { if (mouth == null) { return; } OpenMouth(false); mouth.Reset(); mouth.enabled = animate; foreach (FishPartAnim fishWatchAnimPart in fishWatchAnimParts) { if (fishWatchAnimPart != null) { fishWatchAnimPart.enabled = animate && fish.watchStyle == Fish.WatchStyle.HANDS; fishWatchAnimPart.enabled = false; } } fishAnimSwim.currentWatchFishSpeed = 0f; } }