Files
SXDMystery/Assets/_SXDMystery/Scripts/Task/FragmentTask/FragmentTask.cs
2025-12-11 11:24:43 +08:00

122 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections;
using UnityEngine;
using DG.Tweening;
using System.Collections.Generic;
using DarkTonic.MasterAudio;
/// <summary>
/// 拼接文物任务管理器
/// </summary>
public class FragmentTask : MonoBehaviour
{
[Header("碎片预制体对应ID")]
public Fragment[] fragmentPres; // 拖入碎片预制体里面含Mesh
[Header("碎片正确位置(吸附点)")]
public Transform[] fragmentEndPos; // 放入碎片目标点要与ID对应
[Header("当前任务生成的碎片父对象")]
public Transform fragmentParent;
[Header("虚线外轮廓 Prefab")]
public GameObject dashOutlinePrefab;
[Header("介绍UI")]
public GameObject introUI;
[Header("介绍语音")]
[SoundGroup]
public string introVoice;
private List<Fragment> allFragments = new List<Fragment>();
private bool taskCompleted = false;
void Start()
{
InitTask();
}
/// <summary>
/// 初始化所有碎片
/// </summary>
void InitTask()
{
for (int i = 0; i < fragmentPres.Length; i++)
{
Fragment frag = Instantiate(fragmentPres[i], fragmentParent);
frag.id = i;
frag.SetStartPos(frag.transform.position);
// 创建对应吸附点组件
FragmentSnapPoint snap = fragmentEndPos[i].gameObject.AddComponent<FragmentSnapPoint>();
snap.fragmentID = i;
allFragments.Add(frag);
}
// 一开始禁用虚线轮廓
if (dashOutlinePrefab != null)
dashOutlinePrefab.SetActive(false);
}
/// <summary>
/// 碎片成功吸附时调用
/// </summary>
public void OnFragmentSet()
{
// 检查是否全部完成
foreach (var f in allFragments)
{
if (!f.isSet) return;
}
// 全部完成
TaskFinished();
}
void TaskFinished()
{
if (taskCompleted) return;
taskCompleted = true;
// 整体模型飞出来
StartCoroutine(FinishAnim());
}
IEnumerator FinishAnim()
{
// 整体发光
foreach (var frag in allFragments)
{
frag.PlayGlow(true);
}
yield return new WaitForSeconds(0.5f);
// 整体模型飞到玩家前
Transform cam = Camera.main.transform;
Vector3 target = cam.position + cam.forward * 0.8f;
fragmentParent.DOMove(target, 1f).SetEase(Ease.OutBack);
yield return new WaitForSeconds(1.5f);
// 播放介绍 UI & 声音
if (introUI) introUI.SetActive(true);
GameManager.Ins.PlaySound2DRPC(introVoice);
yield return new WaitForSeconds(4f);
// 飞回原位
fragmentParent.DOMove(transform.position, 1f);
yield return new WaitForSeconds(1f);
// 停止发光
foreach (var frag in allFragments)
{
frag.PlayGlow(false);
}
}
}