Files
MRFishingMaster/Assets/_FishingMaster/Scripts/Statue/FragmentFlyEffect.cs

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();
}
}