Files
aibis-dream/Assets/Scripts/UI/Panel/TaskPanel.cs
T
2025-05-12 14:49:02 +08:00

163 lines
4.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using AibisDream.Framework;
using AibisDream.Kit;
using AibisDream.Utility;
using DG.Tweening;
using TMPro;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream
{
public class TaskPanel : MonoBehaviour, IUIPanel, IDialogView
{
private RectTransform _rectTransform;
private Transform _taskListParent;
private GameObject _taskItemPrefab;
private GameObject TaskItemPrefab
{
get
{
if (_taskItemPrefab == null)
{
_taskItemPrefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.TaskItemName);
}
return _taskItemPrefab;
}
}
private readonly Dictionary<string, LocalizedText> _taskDict = new();
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
_taskListParent = transform.Find("Record");
EnumEventSystem.Global.Register(GameLoopEnum.GameQuit, ClearTasks);
}
#region 诊疗单功能
public void CompleteTask(string lineId)
{
if (_taskDict.TryGetValue(lineId, out var taskItem))
{
var taskText = taskItem.GetComponent<TMP_Text>();
taskText.fontStyle |= FontStyles.Strikethrough;
taskText.color = Color.gray;
}
}
public void ClearTasks()
{
foreach (var task in _taskDict)
{
Destroy(task.Value.gameObject);
}
_taskDict.Clear();
}
#endregion
#region 对话框功能实现
public void ShowLine(string dialogLine, CharacterVo character, Action nextStep, string lineId, bool isAutoSkip = false)
{
var taskItem = Instantiate(TaskItemPrefab, _taskListParent);
// 设置本地化数据
var localize = taskItem.GetComponent<LocalizedText>();
localize.SetLocalizedText(DialogController.Instance.GetCurLocalizedTableName(), lineId);
_taskDict[lineId] = localize;
EnumEventSystem.Global.Send(DialogEventEnum.LineShown);
EnumEventSystem.Global.Send(DialogEventEnum.LineEnd);
nextStep.Invoke();
}
public void ShowOptions(DialogOption[] dialogueOptions)
{
Debug.Log("Task 面板不能显示选项");
}
public void HideDialog()
{
// HideDialog应该由其他函数控制
}
public bool TrySkipLine(bool isForceSkip = false)
{
// 这里不能跳过对话
return true;
}
public void NextStep()
{
// 这里不能手动跳到下一行
}
#endregion
#region 打开和关闭
public bool IsOpen { get; private set;}
public void Show()
{
gameObject.SetActive(true);
AudioManager.Instance.PlaySfx("event:/Scriptal/taskmanager");
// 下移
_rectTransform.DOAnchorPosY(-350, 1f).OnComplete(() =>
{
IsOpen = true;
});
}
public void Hide()
{
// 上移
AudioManager.Instance.PlaySfx("event:/Scriptal/taskmanager");
_rectTransform.DOAnchorPosY(0, 1f).OnComplete(() =>
{
gameObject.SetActive(false);
IsOpen = false;
});
}
#endregion
}
public static class TaskYarnCommand
{
private static TaskPanel TaskPanel => UIManager.Instance.GetPanel<TaskPanel>();
[YarnCommand("complete_task")]
public static void CompleteTask(string lineId)
{
TaskPanel.CompleteTask(lineId);
}
[YarnCommand("clear_tasks")]
public static void ClearTasks()
{
TaskPanel.ClearTasks();
}
[YarnCommand("task_moveIn")]
public static IEnumerator ShowTask()
{
UIManager.Instance.ShowPanel<TaskPanel>();
yield return new WaitForSeconds(1);
}
[YarnCommand("task_moveOut")]
public static IEnumerator HideTask()
{
UIManager.Instance.HidePanel<TaskPanel>();
yield return new WaitForSeconds(1);
}
}
}