163 lines
4.4 KiB
C#
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);
|
|
}
|
|
_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);
|
|
}
|
|
}
|
|
}
|