131 lines
3.6 KiB
C#
131 lines
3.6 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using DG.Tweening;
|
|
|
|
/// <summary>
|
|
/// 碎片飞行效果 - 被击中后从漂流瓶飞到石像位置
|
|
/// </summary>
|
|
public class FragmentFlyEffect : MonoBehaviour
|
|
{
|
|
[Header("视觉效果")]
|
|
public ParticleSystem trailEffect; // 拖尾特效
|
|
|
|
[Header("飞行配置")]
|
|
public float flyDuration = 1.5f; // 飞行时间
|
|
public float flyHeight = 3f; // 飞行弧线高度
|
|
public Ease flyEase = Ease.InOutQuad; // 缓动类型
|
|
public float rotateSpeed = 720f; // 旋转速度
|
|
|
|
[Header("缩放动画")]
|
|
public float startScale = 0.5f; // 起始缩放
|
|
public float endScale = 1f; // 结束缩放
|
|
public float popScale = 1.3f; // 到达时的弹跳缩放
|
|
|
|
private Transform targetStatue; // 目标石像
|
|
private int fragmentIndex; // 碎片序号
|
|
private int statueIndex; // 雕像序号
|
|
private Action<int, int> onArrived; // 到达回调
|
|
|
|
private Vector3 startPosition;
|
|
private bool isFlying = false;
|
|
|
|
private void Awake()
|
|
{
|
|
// 初始化缩放
|
|
transform.localScale = Vector3.one * startScale;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化碎片飞行
|
|
/// </summary>
|
|
public void Initialize(Vector3 startPos, Transform target, int fragIdx, int statIdx, Action<int, int> callback)
|
|
{
|
|
startPosition = startPos;
|
|
targetStatue = target;
|
|
fragmentIndex = fragIdx;
|
|
statueIndex = statIdx;
|
|
onArrived = callback;
|
|
|
|
transform.position = startPos;
|
|
|
|
// 启用特效
|
|
if (trailEffect != null)
|
|
trailEffect.Play();
|
|
// 开始飞行
|
|
StartFly();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 开始飞行动画
|
|
/// </summary>
|
|
private void StartFly()
|
|
{
|
|
isFlying = true;
|
|
|
|
// 计算贝塞尔曲线路径
|
|
Vector3 endPos = targetStatue.position;
|
|
Vector3 midPos = (startPosition + endPos) * 0.5f + Vector3.up * flyHeight;
|
|
|
|
// 创建路径点数组
|
|
Vector3[] path = new Vector3[] { startPosition, midPos, endPos };
|
|
|
|
// 路径动画
|
|
transform.DOPath(path, flyDuration, PathType.CatmullRom)
|
|
.SetEase(flyEase)
|
|
.OnComplete(OnArrived);
|
|
|
|
// 旋转动画
|
|
transform.DORotate(new Vector3(0, rotateSpeed, 0), flyDuration, RotateMode.LocalAxisAdd)
|
|
.SetEase(Ease.Linear);
|
|
|
|
// 缩放动画 - 先变大再恢复正常
|
|
transform.DOScale(endScale, flyDuration * 0.8f)
|
|
.SetEase(Ease.OutQuad);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!isFlying) return;
|
|
|
|
// 可以在这里添加额外的效果,如光晕变化等
|
|
}
|
|
|
|
/// <summary>
|
|
/// 到达目标
|
|
/// </summary>
|
|
private void OnArrived()
|
|
{
|
|
isFlying = false;
|
|
|
|
// 停止拖尾
|
|
if (trailEffect != null)
|
|
trailEffect.Stop();
|
|
|
|
// 弹跳效果
|
|
transform.DOScale(popScale, 0.15f)
|
|
.SetEase(Ease.OutQuad)
|
|
.OnComplete(() =>
|
|
{
|
|
transform.DOScale(endScale, 0.1f)
|
|
.SetEase(Ease.InQuad)
|
|
.OnComplete(() =>
|
|
{
|
|
// 触发回调
|
|
onArrived?.Invoke(fragmentIndex, statueIndex);
|
|
|
|
// 销毁自身
|
|
Destroy(gameObject);
|
|
});
|
|
});
|
|
|
|
// 播放到达音效
|
|
//GameManager.Ins?.PlaySound3D("碎片到达", transform);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
// 停止所有DOTween动画
|
|
transform.DOKill();
|
|
}
|
|
}
|