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()
{
transform.DOMove(point[index], 0.01f).OnComplete(Bezier_Move);
index++;
if (index >= point.Count)
{
//到终点了
Close();
}
}
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));
}
}