using System.Collections.Generic; using DG.Tweening; using UnityEngine; using UnityEngine.UI; /// /// 图片飞向宝箱脚本 /// public class FlyImage : MonoBehaviour { private Vector3 endP;//终点 private Vector3 p1;//控制点,来调节曲线效果 private Vector3 startP;// private int index; private List point = new List(); private RectTransform ts; /// /// Awake is called when the script instance is being loaded. /// void Awake() { tmpImage = transform.GetComponent(); ts = transform.GetComponent(); } private Image tmpImage; /// /// 设置终点 /// /// 终点 /// 是否使用贝塞尔 public void SetDestination(Sprite sp, Vector3 startP, Vector3 endP, bool useBezier) { tmpImage.sprite = sp; transform.position = startP; ts.localPosition += RandomPos(); if (useBezier) { index = 0; //startP = transform.position; p1 = transform.position + GetOffect(); point = new List(); for (int i = 1; i < 101; i++) { Vector3 Bezierposition = BezierMath2(transform.position, p1, endP, (float)(i * 0.01)); point.Add(Bezierposition); } Bezier_Move(); } else { transform.DOMove(endP, 2f).SetEase(Ease.OutQuad).OnComplete(Close); } } bool isUp; private Vector3 RandomPos() { Vector3 tmpV = Vector3.zero; tmpV.x -= UnityEngine.Random.Range(10, 20); int a = UnityEngine.Random.Range(-20, 20); isUp = a > 0; tmpV.z += a; return tmpV; } private Vector3 GetOffect() { Vector3 tmpV = Vector3.zero; tmpV.x -= UnityEngine.Random.Range(10, 15); if (isUp) { tmpV.z += UnityEngine.Random.Range(20, 40); } else { tmpV.z -= UnityEngine.Random.Range(20, 40); } return tmpV; } /// /// 控制物体沿曲线移动 /// private void Bezier_Move() { if (index + 2 >= point.Count) { //到终点了 Close(); return; } else { transform.DOMove(point[index], 0.01f).OnComplete(Bezier_Move); index += 2; } } private void Close() { //Debug.Log("到终点了,可以消失了"); gameObject.SetActive(false); } /// /// 计算贝塞尔曲线 /// /// 开始点 /// 控制点,来调节曲线效果 /// 终点 /// i * 0.01 100个点里面的比例 /// private Vector3 BezierMath2(Vector3 startP, Vector3 p1, Vector3 endP, float t) { return (1 - t) * (1 - t) * startP + 2 * (1 - t) * t * p1 + t * t * endP; } // // 三次贝塞尔 // public static Vector3 Bezier_3(Vector3 startP, Vector3 p1, Vector3 p2, Vector3 endP, float t) { return (1 - t) * ((1 - t) * ((1 - t) * startP + t * p1) + t * ((1 - t) * p1 + t * p2)) + t * ((1 - t) * ((1 - t) * p1 + t * p2) + t * ((1 - t) * p2 + t * endP)); } }