using DG.Tweening; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Splines; public class FishCome : MonoBehaviour { public Animator animator; public SplineAnimate ssplineAnimate; public Transform FishAnimationRoot; GameObject splinesRoot; FishComeSplines fishComeSplines; float posY; private void Awake() { ssplineAnimate.enabled = false; } public async void LoadSplines(string splinesRootName) { splinesRoot = await Addressables.InstantiateAsync(splinesRootName, transform.parent).Task; splinesRoot.transform.localPosition = Vector3.up * posY; fishComeSplines = splinesRoot.GetComponent(); } public void SetPosY(float y) { posY = y; var pos = transform.position; transform.position = new Vector3(pos.x, y, pos.z); splinesRoot.transform.position = new Vector3(0, y, 0); } public void FishComeMove(float speed) { if (fishComeSplines != null) { SplineContainer[] splineContainers = fishComeSplines.splineContainers; if (splineContainers == null || splineContainers.Length < 1) { return; } ssplineAnimate.MaxSpeed = speed; ssplineAnimate.Container = splineContainers[Random.Range(0, splineContainers.Length)]; ssplineAnimate.enabled = true; ssplineAnimate.Restart(true); ssplineAnimate.Play(); } } public float UIEatMove(float speed, SplineContainer splineContainer) { ssplineAnimate.MaxSpeed = speed; //SplineContainer splineContainer = UIEatSplines[Random.Range(0, UIEatSplines.Length)]; ssplineAnimate.Container = splineContainer; ssplineAnimate.enabled = true; ssplineAnimate.Restart(false); ssplineAnimate.Play(); return splineContainer.CalculateLength() / speed; } public async Task FishEatMove(float speed) { if (fishComeSplines == null) { return; } SplineContainer[] UIEatSplines = fishComeSplines.UIEatSplines; if (UIEatSplines == null || UIEatSplines.Length < 1) { return; } SplineContainer splineContainer; if (ssplineAnimate.IsPlaying) { FishComeStop(); Vector3 position = transform.position; splineContainer = UIEatSplines[0]; Spline spline = splineContainer[0]; Vector3 initialPosition = spline[0].Position; float distance = Vector3.Distance(initialPosition, position); SplineContainer splineContainer1; Spline spline1; Vector3 initialPosition1; float distance1; for (int i = 1; i < UIEatSplines.Length; i++) { splineContainer1 = UIEatSplines[i]; spline1 = splineContainer1[0]; initialPosition1 = spline1[0].Position; distance1 = Vector3.Distance(initialPosition1, position); if (distance1 < distance) { distance = distance1; splineContainer = splineContainer1; initialPosition = initialPosition1; } } initialPosition += fishComeSplines.transform.position; Quaternion rotation11 = Quaternion.LookRotation(transform.position - initialPosition); float time11 = distance / speed; transform.DORotateQuaternion(rotation11, 0.1f); transform.DOLocalMove(initialPosition, time11); await new WaitForSeconds(time11); } else { splineContainer = UIEatSplines[Random.Range(0, UIEatSplines.Length)]; } float time = UIEatMove(speed, splineContainer); if (time > 4) { time = 4; } await new WaitForSeconds(time); } public void FishComeStop() { animator.Play("Idle01"); ssplineAnimate.enabled = false; } }