hch
2025-08-28 16a90aa94d8579cc120c9962d389b59bda5e7398
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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<ImageEx> imgMoneys = new List<ImageEx>();
    
    /// <summary>
    /// 播放掉落动画
    /// </summary>
    /// <param name="targetPosition">目的地坐标</param>
    /// <param name="moneyType">货币类型</param>
    /// <param name="num">掉几个货币</param>
    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<ImageEx>();
                //挂父节点
                imgMoney.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
                var moneyImg = imgMoney.GetComponent<ImageEx>();
                moneyImg.SetIconWithMoneyType(moneyType);
                moneyImg.raycastTarget = false;
                moneyImg.GetComponent<RectTransform>().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;
                    }
                });
 
 
            }
        }
    }
}