using DG.Tweening; using System.Collections.Generic; using UnityEngine; //获得货币动画 public class MoneyMoveByPath : MonoBehaviour { [Header("第一段动画移动时间")] public float duration1 = 1f; // 动画持续时间 [Header("随机初始左右间距")] public float spacing = 50f; // 设置图片之间的间隔 [Header("X参考偏移值")] public float XPath = 50f; [Header("Y参考偏移值")] public float YPath = 100f; [Header("Y参考偏移值")] public AnimationCurve heightCurve; // 用于定义路径高度的曲线 [Header("第二段动画飘到目的地")] public float duration2 = 0.4f; // 动画持续时间 public Transform targetPosition; List imgMoneys = new List(); /// /// 播放掉落动画 /// /// 目的地坐标 /// 货币类型 /// 掉几个货币 public void PlayAnimation(int moneyType, int num) { int createImgCnt = 0; if (imgMoneys.IsNullOrEmpty()) { createImgCnt = num; } else { createImgCnt = Mathf.Max(0, num - imgMoneys.Count); } if (createImgCnt > 0) { for (int i = 0; i < createImgCnt; i++) { var imgMoney = new GameObject("moneyIcon" + i); imgMoney.AddMissingComponent(); //挂父节点 imgMoney.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one); var moneyImg = imgMoney.GetComponent(); moneyImg.SetIconWithMoneyType(moneyType); moneyImg.raycastTarget = false; moneyImg.GetComponent().sizeDelta = new Vector2(40, 40); imgMoneys.Add(moneyImg); } } //通过 heightCurve 生成路径,时间为x 总时间为1,y为高度,偏移量为100 int pointCount = 30; Vector3[] points = new Vector3[pointCount]; for (int i = 0; i < pointCount; i++) { float x = i / (pointCount - 1f); float y = heightCurve.Evaluate(x) * YPath; points[i] = new Vector3(x * XPath, y, 0); } for (int i = 0; i < imgMoneys.Count; i++) { var moneyImg = imgMoneys[i]; if (num <= i) { moneyImg.transform.localScale = Vector3.zero; } else { moneyImg.transform.localScale = Vector3.one; int randDir = Random.Range(0, 2) == 0 ? 1 : -1; float offsetX = Random.Range(0, spacing); // x y 随机下差异 float randX = Random.Range(0.2f, 1f); float randY = Random.Range(0.6f, 1f); Vector3[] points2 = new Vector3[pointCount]; for (int j = 0; j < points.Length; j++) { points2[j] = new Vector3((points[j].x + offsetX)* randDir * randX, points[j].y * randY, points[j].z); } moneyImg.transform.localPosition = points2[0]; moneyImg.transform.DOLocalPath(points2, duration1, PathType.CatmullRom).SetEase(Ease.InOutSine).OnComplete(() => { if (targetPosition != null) { //移动到目标位置 moneyImg.transform.DOMove(targetPosition.position, duration2).OnComplete(() => { moneyImg.transform.localScale = Vector3.zero; }); } else { moneyImg.transform.localScale = Vector3.zero; } }); } } } }