119 lines
4.1 KiB
C#
119 lines
4.1 KiB
C#
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<FishComeSplines>();
|
|
}
|
|
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;
|
|
}
|
|
}
|