using System; using AibisDream.Framework; using AibisDream.Kit; using UnityEngine; using UnityEngine.Events; using Yarn.Unity; namespace AibisDream { public class DialogController : Singleton { private DialogueRunner _dialogueRunner; # region controller状态标识 private bool _isTalking; public bool IsTalking { set { if (_isTalking == value) return; _isTalking = value; Debug.Log($"IsTalking 状态更改: {_isTalking}"); if (value) { OnDialogueStart?.Invoke(); } else { OnDialogueComplete?.Invoke(); } } get => _isTalking; } public bool quickRunMode; # endregion public static UnityAction OnDialogueStart; public static UnityAction OnDialogueComplete; private void Start() { _dialogueRunner = GetComponentInChildren(); _dialogueRunner.onDialogueStart.AddListener(() => { EnumEventSystem.Global.Send(InteractionEventEnum.End); OnDialogueStart?.Invoke(); IsTalking = true; }); _dialogueRunner.onDialogueComplete.AddListener(() => { EnumEventSystem.Global.Send(InteractionEventEnum.Start); OnDialogueComplete?.Invoke(); IsTalking = false; }); RegisterEvent(); } private void RegisterEvent() { EnumEventSystem.Global.Register(EventEnum.SceneUnload, ResetDialog); } private void ResetDialog() { _dialogueRunner.Stop(); StorageSystem.Instance.Clear(); DialogCanvasManager.Instance.HideDialog(); DialogCanvasManager.Instance.SwitchDialogView(DialogViewType.OldBox); } /// /// 开启对话 /// /// Yarn组 public void StartDialog(YarnProject yarnProject) { _dialogueRunner.SetProject(yarnProject); _dialogueRunner.StartDialogue("Start"); } public void StopDialog() { _dialogueRunner.Stop(); } public void LoadDialog(YarnProject yarnProject) { _dialogueRunner.SetProject(yarnProject); _dialogueRunner.StartDialogue("Center"); } public void StartDialogNode(string nodeName) { if (CheckIfNodeExistInCurrentYarnProject(nodeName)) { _dialogueRunner.StartDialogue(nodeName); } } public bool CheckIfNodeExistInCurrentYarnProject(string nodeName) { YarnProject currentProject = _dialogueRunner.yarnProject; string[] nodeNames = currentProject.NodeNames; if (Array.Exists(nodeNames, item => item == nodeName)) { return true; } else { Debug.Log($"节点 {nodeName} 不存在!"); return false; } } /// /// 跳到下一句 /// public void JumpLine() { if (!DialogCanvasManager.Instance.TrySkipLine()) { DialogCanvasManager.Instance.NextStep(); } } } }