122 lines
2.9 KiB
C#
122 lines
2.9 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|