using System; using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using UnityEngine; using UnityEngine.Events; using Yarn.Unity; namespace AibisDream { public class DialogController : Singleton { private DialogueRunner _dialogueRunner; private VariableStorageBehaviour _variableStorage; # 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(); _variableStorage = 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; }); } #region 变量操作 public bool TryGetVariable(string variableName, out T result) { return _variableStorage.TryGetValue(variableName, out result); } public void SetVariable(string variableName, string value) { _variableStorage.SetValue(variableName, value); } public void SetVariable(string variableName, bool value) { _variableStorage.SetValue(variableName, value); } public void SetVariable(string variableName, float value) { _variableStorage.SetValue(variableName, value); } public bool Contains(string variableName) { return _variableStorage.Contains(variableName); } public void ClearVariables() { _variableStorage.Clear(); } #endregion /// /// 开启对话 /// /// Yarn组 public void StartDialog(YarnProject yarnProject) { _dialogueRunner.SetProject(yarnProject); _dialogueRunner.StartDialogue("Start"); } 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.GetCurView().TrySkipLine()) { AudioManager.Instance.StopVoice(); DialogCanvasManager.GetCurView().NextStep(); } } #region 命令名 [YarnCommand("NextYarn")] public static void NextYarn() { EnumEventSystem.Global.Send(EventEnum.NextYarn); Instance.ClearVariables(); Instance.StartCoroutine(GameLoopManager.Instance.NextSceneSo()); } [YarnCommand("switch_tv")] public static void SwitchTV(string picName) { MainUIController.Instance.SwitchTV(picName); } [YarnCommand("show_tv_scene")] public static void ShowTVScene(float duration) { MainUIController.Instance.TVFadeIn(duration); } [YarnCommand("load_scene")] public static IEnumerator LoadScene(string sceneName, float duration = 1) { HideDialog(); yield return SceneLoader.Instance.LoadSceneAsync(sceneName); DialogCanvasManager.Instance.SwitchDialogView(sceneName == "ClinicScene" ? DialogViewType.Bubble : DialogViewType.OldBox); AudioManager.PlayAmb2Audio("amb_general"); } [YarnCommand("unload_scene")] public static IEnumerator UnloadScene(string sceneName) { yield return SceneLoader.Instance.UnloadSceneAsync(sceneName); } [YarnCommand("hide_dialog")] public static void HideDialog() { DialogCanvasManager.GetCurView().HideDialog(); } [YarnCommand("fade_in")] public static IEnumerator FadeIn(float duration) { return MainUIController.Instance.FadeInSync(duration); } [YarnCommand("fade_out")] public static IEnumerator FadeOut(float duration) { return MainUIController.Instance.FadeOutSync(duration); } [YarnCommand("show_obj")] public static IEnumerator ShowObj(string picName) { return MainUIController.Instance.ShowObj(picName); } [YarnCommand("hide_obj")] public static IEnumerator HideObj() { return MainUIController.Instance.HideObj(); } [YarnCommand("switch_dialog_view")] public static void SwitchDialogView(string viewName) { DialogCanvasManager.Instance.SwitchDialogView(Enum.Parse(viewName)); } #endregion } }