using System; using System.Collections; using System.Collections.Generic; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.Utility; using DG.Tweening; using UnityEngine; using UnityEngine.UI; 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(ConstRef.TaskItemName); } return _taskItemPrefab; } } private readonly Dictionary _taskDict = new(); private void Awake() { _rectTransform = GetComponent(); _taskListParent = transform.Find("Record"); EnumEventSystem.Global.Register(GameLoopEnum.GameQuit, OnGameQuit); EnumEventSystem.Global.Register(EventEnum.NextYarn, ClearTasks); } #region 诊疗单功能 public void CompleteTask(string lineId) { if (_taskDict.Remove(lineId, out var taskItem)) { Destroy(taskItem.gameObject); } } public void ClearTasks() { foreach (var task in _taskDict) { Destroy(task.Value.gameObject); } _taskDict.Clear(); } public void OnGameQuit() { ClearTasks(); UIManager.Instance.HidePanel(); } #endregion #region 对话框功能实现 public void ShowLine(string dialogLine, CharacterVo character, Action nextStep, string lineId, bool isAutoSkip = false) { _taskListParent.gameObject.SetActive(false); var taskItem = Instantiate(TaskItemPrefab, _taskListParent); // 设置本地化数据 var localize = taskItem.GetComponent(); localize.SetLocalizedText(DialogController.Instance.GetCurLocalizedTableName(), lineId); _taskDict[lineId] = localize; EnumEventSystem.Global.Send(DialogEventEnum.LineShown); EnumEventSystem.Global.Send(DialogEventEnum.LineEnd); nextStep.Invoke(); _taskListParent.gameObject.SetActive(true); LayoutRebuilder.ForceRebuildLayoutImmediate(_taskListParent.GetComponent()); } public void ShowOptions(DialogOption[] dialogueOptions) { Debug.Log("Task 面板不能显示选项"); } public void HideDialog() { // HideDialog应该由其他函数控制 } public bool TrySkipLine(bool isForceSkip = false) { // 这里不能跳过对话 return true; } public void NextStep() { // 这里不能手动跳到下一行 } public void OnLocalizationChanged(string value) { } #endregion #region 打开和关闭 public bool IsOpen { get; private set;} public bool IsCloseable => false; public void Show() { 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(() => { IsOpen = false; }); } #endregion } public static class TaskYarnCommand { private static TaskPanel TaskPanel => UIManager.Instance.GetPanel(); [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(); yield return new WaitForSeconds(1); } [YarnCommand("task_moveOut")] public static IEnumerator HideTask() { UIManager.Instance.HidePanel(); yield return new WaitForSeconds(1); } } }