using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEditor; using UnityEngine.UI; using Cysharp.Threading.Tasks; using DefaultNamespace.ProcessMode; using MotionFramework; using TMPro; namespace Framework.Manager { public class TutorialGuideManager : MonoBehaviour { public static TutorialGuideManager Instance; public GameObject UIButton; [Header("引导设置")] [Tooltip("引导配置表")] [SerializeField] private TutorialGuideConfig guideConfig; [Space(5)] [Tooltip("是否启用引导跳转功能")] [SerializeField] private bool enableSmartGuideJump = true; [Space(10)] [Header("状态信息")] [SerializeField, ReadOnly] private int currentIndex = -1; [SerializeField, ReadOnly] private bool isGuiding = false; // [SerializeField, ReadOnly] private bool isGuideDisabled = false; [Space(5)] [Tooltip("是否启用UI显示状态检测")] [SerializeField] private bool enableUIStateCheck = true; // 运行时存储UI对象的字典 private Dictionary uiObjects = new Dictionary(); // 待处理的UI注册队列 private HashSet pendingUIObjects = new HashSet(); // ProcessManager引用,用于获取当前流程步骤信息 // private ProcessManager processManager; // 记录已匹配引导的步骤名称,避免同一步骤内重复匹配 private string lastMatchedStepName = string.Empty; // 记录被隐藏但需要重新显示的步骤名称 private HashSet hiddenStepsToRedisplay = new HashSet(); // 记录当前步骤名称下已执行的引导数量,用于支持同一步骤下的多个引导按顺序执行 private Dictionary stepExecutionCount = new Dictionary(); // 安全帽点击特殊处理状态 private bool hasHelmetClicked = false; // 是否已点击安全帽 private string helmetClickedObjectName = string.Empty; // 点击的安全帽对象名称 private int helmetNextGuideIndex = -1; // 安全帽点击后的下一个引导索引 // 添加自定义特性类 public class ReadOnlyAttribute : PropertyAttribute { } #if UNITY_EDITOR // 自定义属性绘制器 [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] public class ReadOnlyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { GUI.enabled = false; EditorGUI.PropertyField(position, property, label); GUI.enabled = true; } } #endif [ContextMenu("开始引导")] private void StartGuideIn() { StartGuide(); } [ContextMenu("下一步")] public async void NextGuideIn() { await TriggerNextGuide(); } [ContextMenu("上一步")] public async void LastStepIn() { await TriggerPrevGuide(); } [ContextMenu("隐藏引导")] private void HideGuideInEditor() { HideGuide(); } [ContextMenu("打印引导配置")] private void PrintGuideConfig() { if (guideConfig == null) { Debug.Log("TutorialGuideManager: 引导配置为空"); return; } var orderedSteps = guideConfig.GetOrderedSteps(); Debug.Log($"TutorialGuideManager: 引导配置总步骤数: {orderedSteps.Count}"); for (int i = 0; i < orderedSteps.Count; i++) { var step = orderedSteps[i]; Debug.Log($"TutorialGuideManager: 步骤 {i}: stepName='{step.stepName}', uiObjectName='{step.uiObjectName}', order={step.order}"); } } /// /// 停用引导系统 /// 调用此方法后,TriggerNextGuide将不再执行引导逻辑 /// public void DisableGuide() { Destroy(this.gameObject); //isGuideDisabled = true; Debug.Log("TutorialGuideManager: 引导系统已停用"); } /// /// 启用引导系统 /// 重新启用引导系统,可以继续执行引导 /// public void EnableGuide() { //isGuideDisabled = false; Debug.Log("TutorialGuideManager: 引导系统已启用"); } private void Awake() { Instance = this; // 初始化ProcessManager引用 // processManager = MotionEngine.GetModule(); } private void Start() { // InitializeGuideObjects(); // StartGuide(); } private void Update() { if (Input.GetKeyDown(KeyCode.F1)) { LastStepIn(); } if (Input.GetKeyDown(KeyCode.F2)) { NextGuideIn(); } if (Input.GetKeyDown(KeyCode.F3)) { MotionEngine.GetModule().JumpToProcessAsync(4, 2); } } // 初始化引导对象 public void InitializeGuideObjects(string tipc) { Debug.Log(tipc); guideConfig = Resources.Load("Tipsconfig/" + tipc); if (guideConfig == null) { Debug.LogError("TutorialGuideManager: 引导配置为空!"); return; } var orderedSteps = guideConfig.GetOrderedSteps(); foreach (var step in orderedSteps) { // 在场景中查找UI对象 GameObject uiObject = GameObject.Find(step.uiObjectName); if (uiObject != null) { RegisterUIObject(step.uiObjectName, uiObject); } else { // 将未找到的UI添加到待处理队列 pendingUIObjects.Add(step.uiObjectName); Debug.LogWarning($"TutorialGuideManager: 未找到UI对象 {step.uiObjectName},已添加到待处理队列"); } } } // 注册UI对象 public void RegisterUIObject(string uiName, GameObject uiObject) { if (string.IsNullOrEmpty(uiName) || uiObject == null) { Debug.LogError("TutorialGuideManager: 注册UI对象失败,参数无效!"); return; } if (uiObjects.ContainsKey(uiName)) { uiObjects[uiName] = uiObject; } else { uiObjects.Add(uiName, uiObject); } Debug.Log($"TutorialGuideManager: 注册UI对象 {uiName}"); // 从待处理队列中移除 pendingUIObjects.Remove(uiName); // 如果当前正在引导,检查是否需要更新引导 if (isGuiding) { UpdateCurrentGuideIfNeeded(uiName); } } // 取消注册UI对象 public void UnregisterUIObject(string uiName) { if (uiObjects.ContainsKey(uiName)) { uiObjects.Remove(uiName); Debug.Log($"TutorialGuideManager: 取消注册UI对象 {uiName}"); } } // 更新当前引导状态(如果需要) private void UpdateCurrentGuideIfNeeded(string uiName) { var currentStep = GetCurrentStep(); if (currentStep != null && currentStep.uiObjectName == uiName) { // 当前引导步骤正好是刚注册的UI对象 if (uiObjects.TryGetValue(uiName, out GameObject uiObject)) { Debug.Log($"TutorialGuideManager: 更新当前引导 - {currentStep.stepName}"); GuideMask.Instance.CreateRectangleMask(uiObject); } } } // 检查UI对象是否已注册 public bool IsUIObjectRegistered(string uiName) { return uiObjects.ContainsKey(uiName); } // 获取待注册的UI对象列表 public HashSet GetPendingUIObjects() { return new HashSet(pendingUIObjects); } // 开始引导流程 public async void StartGuide() { if (guideConfig == null) { Debug.LogError("TutorialGuideManager: 引导配置为空!"); return; } var orderedSteps = guideConfig.GetOrderedSteps(); if (orderedSteps.Count == 0) { Debug.LogError("TutorialGuideManager: 引导步骤为空!"); return; } if (isGuiding) { Debug.LogWarning("TutorialGuideManager: 引导流程已经在进行中!"); return; } Debug.Log($"TutorialGuideManager: 开始引导流程,总步骤数: {orderedSteps.Count}"); isGuiding = true; currentIndex = -1; await TriggerNextGuide(); } public void TriggerNextGuideBtton() { TriggerNextGuide("下一步"); } // 触发下一个引导步骤 public async UniTask TriggerNextGuide(string uiName = null) { if (!isGuiding) { Debug.LogWarning("引导流程未开始!"); return false; } // if (uiName == "关闭") // { // HideGuide(); // return; // } // 参数匹配逻辑:根据传入的uiName参数决定是否继续引导 if (!string.IsNullOrEmpty(uiName)) { // 获取当前引导步骤 var currentStep = GetCurrentStep(); if (currentStep != null) { // 检查传入的uiName是否与当前步骤的uiObjectName匹配 if (uiName == "下一步") { } else if (uiName == "大厅位置" || uiName == "地磅位置" || uiName == "电脑房" || uiName == "关闭" || uiName == "对话") { if (uiName != currentStep.uiObjectName) { return false; } else { if (uiName != "对话") currentIndex++; } HideGuide(); return true; } else if (uiName != currentStep.uiObjectName) { Debug.Log($"TutorialGuideManager: 参数匹配失败 - 传入的uiName: '{uiName}' 与当前步骤的uiObjectName: '{currentStep.uiObjectName}' 不匹配,停止引导"); return false; } else { Debug.Log($"TutorialGuideManager: 参数匹配成功 - 传入的uiName: '{uiName}' 与当前步骤的uiObjectName: '{currentStep.uiObjectName}' 匹配,继续引导"); } } else { Debug.LogWarning("TutorialGuideManager: 无法获取当前引导步骤,跳过参数匹配检查"); return false; } } else if (uiName == "") { // 传入空字符串,自动跳到下一步引导 Debug.Log("TutorialGuideManager: 传入空字符串,自动跳到下一步引导"); } else { // uiName为null,使用原有逻辑 Debug.Log("TutorialGuideManager: 未传入uiName参数,使用原有引导逻辑"); } if (GuideMask.Instance.guide != null) GuideMask.Instance.guide.gameObject.SetActive(true); bool hasJumpedToGuide = false; var orderedSteps = guideConfig.GetOrderedSteps(); // 只有在没有跳转到引导步骤的情况下才执行currentIndex++ if (!hasJumpedToGuide) { currentIndex++; } if (currentIndex < orderedSteps.Count) { var currentStep = orderedSteps[currentIndex]; if (currentStep.isOpenUI) { // UIButton.SetActive(true); } else { UIButton.SetActive(false); } if (uiObjects.TryGetValue(currentStep.uiObjectName, out GameObject uiObject)) { // 如果启用了UI状态检测,需要检查UI是否完全显示 if (enableUIStateCheck) { if (IsUIObjectFullyDisplayed(uiObject)) { Debug.Log($"执行引导步骤: {currentStep.stepName} 查询的对象:{uiObject.name}"); GuideMask.Instance.CreateRectangleMask(uiObject); // 如果UI对象是InputField,自动聚焦到该输入框 FocusInputFieldIfApplicable(uiObject); } else { Debug.Log($"UI对象 {uiObject.name} 存在但未完全显示,使用延迟查找"); // 使用UniTask来延迟查找UI bool delayedResult = await DelayedFindUIObjectAsync(currentStep); return delayedResult; } } else { Debug.Log($"执行引导步骤: {currentStep.stepName} 查询的对象:{uiObject.name}"); GuideMask.Instance.CreateRectangleMask(uiObject); // 如果UI对象是InputField,自动聚焦到该输入框 FocusInputFieldIfApplicable(uiObject); } return true; } else { // 使用UniTask来延迟查找UI bool delayedResult = await DelayedFindUIObjectAsync(currentStep); return delayedResult; } } else { // 引导流程结束 isGuiding = false; HideGuide(); Debug.Log("引导流程完成!"); DisableGuide(); } return false; } /// /// 只显示遮罩不执行下一步 /// public void ShowMaskdon_tNext() { if (MotionFramework.MotionEngine.GetModule()._currentMode == DefaultNamespace.ProcessMode.ProcessMode.教学模式 || MotionFramework.MotionEngine.GetModule()._currentMode == DefaultNamespace.ProcessMode.ProcessMode.课程预览) { var currentStep = GetCurrentStep(); if (uiObjects.TryGetValue(currentStep.uiObjectName, out GameObject uiObject)) { Debug.Log($"执行引导步骤: {currentStep.stepName} "); GuideMask.Instance.CreateRectangleMask(uiObject); } } } //触发上一个引导步骤 public async UniTask TriggerPrevGuide() { if (!isGuiding) { Debug.LogWarning("引导流程未开始!"); return false; } var orderedSteps = guideConfig.GetOrderedSteps(); currentIndex--; //Debug.Log($"------------------------>{currentIndex}"); if (currentIndex < orderedSteps.Count) { var currentStep = orderedSteps[currentIndex]; if (uiObjects.TryGetValue(currentStep.uiObjectName, out GameObject uiObject)) { Debug.Log($"执行引导步骤: {currentStep.stepName} "); GuideMask.Instance.CreateRectangleMask(uiObject); } else { // 使用UniTask来延迟查找UI bool delayedResult = await DelayedFindUIObjectAsync(currentStep); if (!delayedResult) { Debug.LogWarning($"延迟查找UI对象失败: {currentStep.uiObjectName}"); } } if (currentStep.isOpenUI) { // UIButton.SetActive(true); } else { UIButton.SetActive(false); } return true; } else { // 引导流程结束 isGuiding = false; HideGuide(); Debug.Log("引导流程完成!"); return false; } } private async UniTask DelayedFindUIObjectAsync(GuideStepConfig step) { // 记录尝试次数 int attempts = 0; int maxAttempts = 10; // 最大尝试次数 int delayBetweenAttempts = 300; // 每次尝试间隔时间(毫秒) Debug.Log($"开始延迟查找UI对象: {step.uiObjectName}"); // 将当前步骤的UI对象添加到待处理队列 pendingUIObjects.Add(step.uiObjectName); GameObject foundObject = null; // 初始延迟 await UniTask.Delay(100); // 多次尝试查找UI while (attempts < maxAttempts) { // 尝试查找UI对象 foundObject = FindAndRegisterUI(step.uiObjectName); if (foundObject != null) { // 如果启用了UI状态检测,需要等待UI完全显示 if (enableUIStateCheck) { if (IsUIObjectFullyDisplayed(foundObject)) { Debug.Log($"延迟查找成功且UI完全显示,第{attempts + 1}次尝试找到UI对象: {step.uiObjectName}"); GuideMask.Instance.CreateRectangleMask(foundObject); // 如果UI对象是InputField,自动聚焦到该输入框 FocusInputFieldIfApplicable(foundObject); return true; // 成功找到并显示UI对象 } else { Debug.Log($"第{attempts + 1}次尝试找到UI对象但未完全显示: {step.uiObjectName},继续等待..."); foundObject = null; // 重置foundObject,继续等待 } } else { Debug.Log($"延迟查找成功,第{attempts + 1}次尝试找到UI对象: {step.uiObjectName}"); GuideMask.Instance.CreateRectangleMask(foundObject); // 如果UI对象是InputField,自动聚焦到该输入框 FocusInputFieldIfApplicable(foundObject); return true; // 成功找到并显示UI对象 } } // 等待一段时间再尝试 attempts++; Debug.Log($"第{attempts}次尝试未找到UI对象: {step.uiObjectName},等待下一次尝试..."); await UniTask.Delay(delayBetweenAttempts); } // 如果尝试多次后仍未找到 if (foundObject == null) { Debug.LogWarning($"多次尝试({maxAttempts}次)后仍未找到UI对象: {step.uiObjectName}"); // 判断是否自动跳过 bool autoSkipMissingUI = false; // 可以添加配置选项控制此行为 if (autoSkipMissingUI) { Debug.Log($"自动跳过未找到的UI对象: {step.uiObjectName}"); TriggerNextGuide(); // 跳过当前步骤,继续下一个 return true; // 虽然UI对象未找到,但已自动跳过,视为成功 } else { Debug.Log($"等待UI对象: {step.uiObjectName} 注册后继续引导"); return false; // 延迟查找失败 } } return false; // 默认返回失败 } // 尝试查找并注册UI对象 private GameObject FindAndRegisterUI(string uiName) { // 尝试在场景中查找对象 GameObject uiObject = GameObject.Find(uiName); // 尝试通过名称查找激活/非激活的UI对象 if (uiObject == null) { Canvas[] canvases = FindObjectsOfType(true); foreach (Canvas canvas in canvases) { Transform foundTransform = FindChildRecursively(canvas.transform, uiName); if (foundTransform != null) { uiObject = foundTransform.gameObject; break; } } } // 如果找到了对象,注册它 if (uiObject != null) { RegisterUIObject(uiName, uiObject); return uiObject; } return null; } // 递归查找子对象 private Transform FindChildRecursively(Transform parent, string childName) { if (parent.name == childName) return parent; for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); Transform found = FindChildRecursively(child, childName); if (found != null) return found; } return null; } /// /// 检测UI对象是否完全显示 /// /// 要检测的UI对象 /// 如果UI完全显示返回true,否则返回false private bool IsUIObjectFullyDisplayed(GameObject uiObject) { if (uiObject == null) { Debug.LogWarning("TutorialGuideManager: UI对象为空,无法检测显示状态"); return false; } // 检查对象是否在层级中激活 if (!uiObject.activeInHierarchy) { Debug.Log($"TutorialGuideManager: UI对象 {uiObject.name} 未在层级中激活"); return false; } // 检查CanvasGroup的透明度 CanvasGroup canvasGroup = uiObject.GetComponent(); if (canvasGroup != null) { if (canvasGroup.alpha < 0.9f) { Debug.Log($"TutorialGuideManager: UI对象 {uiObject.name} 透明度不足: {canvasGroup.alpha}"); return false; } } // 检查RectTransform的尺寸 RectTransform rectTransform = uiObject.GetComponent(); if (rectTransform != null) { if (rectTransform.sizeDelta.x <= 0 || rectTransform.sizeDelta.y <= 0) { Debug.Log($"TutorialGuideManager: UI对象 {uiObject.name} 尺寸异常: {rectTransform.sizeDelta}"); return false; } } Debug.Log($"TutorialGuideManager: UI对象 {uiObject.name} 显示状态检测通过"); return true; } // 获取当前引导步骤 public GuideStepConfig GetCurrentStep() { if (!isGuiding || currentIndex < 0) { return null; } var orderedSteps = guideConfig.GetOrderedSteps(); if (currentIndex < orderedSteps.Count) { return orderedSteps[currentIndex]; } return null; } // 重置引导流程 public void ResetGuide() { isGuiding = false; currentIndex = -1; lastMatchedStepName = string.Empty; // 清除已匹配步骤记录 hiddenStepsToRedisplay.Clear(); // 清除待重新显示步骤记录 stepExecutionCount.Clear(); // 清除步骤执行计数记录 // 重置安全帽点击状态 hasHelmetClicked = false; helmetClickedObjectName = string.Empty; helmetNextGuideIndex = -1; } /// /// 标记步骤为已完成,从待重新显示列表中移除 /// /// 步骤名称 public void MarkStepAsCompleted(string stepName) { if (hiddenStepsToRedisplay.Contains(stepName)) { hiddenStepsToRedisplay.Remove(stepName); Debug.Log($"TutorialGuideManager: 步骤 '{stepName}' 已标记为完成,从待重新显示列表中移除"); } } /// /// 清除所有待重新显示的步骤 /// public void ClearHiddenStepsToRedisplay() { hiddenStepsToRedisplay.Clear(); Debug.Log("TutorialGuideManager: 已清除所有待重新显示的步骤"); } /// /// 获取待重新显示的步骤列表 /// /// 待重新显示的步骤名称集合 public HashSet GetHiddenStepsToRedisplay() { return new HashSet(hiddenStepsToRedisplay); } /// /// 记录安全帽点击状态 /// /// 点击的对象名称 public void RecordHelmetClick(string clickedObjectName) { if (string.IsNullOrEmpty(clickedObjectName)) { Debug.LogWarning("TutorialGuideManager: 安全帽点击对象名称为空"); return; } hasHelmetClicked = true; helmetClickedObjectName = clickedObjectName; // 查找安全帽点击后的下一个引导索引 if (guideConfig != null) { var orderedSteps = guideConfig.GetOrderedSteps(); for (int i = 0; i < orderedSteps.Count; i++) { var step = orderedSteps[i]; if (!string.IsNullOrEmpty(step.stepName) && step.stepName.Contains("安全帽")) { // 找到安全帽引导步骤,记录下一个引导索引 if (i + 1 < orderedSteps.Count) { helmetNextGuideIndex = i + 1; Debug.Log($"TutorialGuideManager: 记录安全帽点击状态 - 对象: '{clickedObjectName}', 下一个引导索引: {helmetNextGuideIndex}"); } break; } } } } /// /// 获取安全帽点击状态信息 /// /// 安全帽点击状态信息 public string GetHelmetClickStatus() { if (hasHelmetClicked) { return $"安全帽已点击 - 对象: '{helmetClickedObjectName}', 下一个引导索引: {helmetNextGuideIndex}"; } else { return "安全帽未点击"; } } /// /// 获取当前引导步骤的UI对象 /// /// 当前引导步骤的UI对象,如果没有则返回null public GameObject GetCurrentGuideUIObject() { if (!isGuiding || guideConfig == null) { return null; } var orderedSteps = guideConfig.GetOrderedSteps(); if (currentIndex < 0 || currentIndex >= orderedSteps.Count) { return null; } var currentStep = orderedSteps[currentIndex]; if (uiObjects.TryGetValue(currentStep.uiObjectName, out GameObject uiObject)) { return uiObject; } return null; } // 隐藏引导 public void HideGuide() { // GuideMask.Instance.InitializeMaterial(); // GuideMask.Instance.guide.gameObject.SetActive(false); // UIButton.SetActive(false); try { GuideMask.Instance.rectTransform.gameObject.SetActive(false); GuideMask.Instance.rectTransform.gameObject.SetActive(false); } catch (Exception e) { Debug.Log(e.Message); } } public void ShowGuide() { // 检查流程是否全部完成 var processManager = MotionEngine.GetModule(); // if (processManager != null && processManager.IsProcessComplete()) // { // Debug.Log("TutorialGuideManager: 流程已全部完成,不显示引导"); // return; // } Debug.Log("TutorialGuideManager: 流程未完成,显示引导"); // UIButton.SetActive(true); GuideMask.Instance.rectTransform.gameObject.SetActive(true); } #region UI事件触发系统 /// /// 触发当前UI对象的事件 /// 自动检测UI组件类型并触发相应的事件 /// /// 是否成功触发了事件 public void TriggerCurrentUIEvent() { var currentStep = GetCurrentStep(); if (currentStep == null) { Debug.LogWarning("TutorialGuideManager: 无法获取当前引导步骤,无法触发UI事件"); } if (!uiObjects.TryGetValue(currentStep.uiObjectName, out GameObject uiObject)) { Debug.LogWarning($"TutorialGuideManager: 当前UI对象 {currentStep.uiObjectName} 未注册,无法触发事件"); } Debug.Log($"TutorialGuideManager: 开始触发UI对象 {currentStep.uiObjectName} 的事件"); TriggerUIEvent(uiObject); } /// /// 触发指定UI对象的事件 /// /// 要触发事件的UI对象 /// 是否成功触发了事件 public bool TriggerUIEvent(GameObject uiObject) { if (uiObject == null) { Debug.LogError("TutorialGuideManager: UI对象为空,无法触发事件"); return false; } try { // // 尝试触发Button事件 // if (TryTriggerButtonEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发Button事件 - {uiObject.name}"); // return true; // } // // 尝试触发Toggle事件 if (TryTriggerToggleEvent(uiObject)) { Debug.Log($"TutorialGuideManager: 成功触发Toggle事件 - {uiObject.name}"); return true; } // // //// 尝试触发Slider事件 // //if (TryTriggerSliderEvent(uiObject)) // //{ // // Debug.Log($"TutorialGuideManager: 成功触发Slider事件 - {uiObject.name}"); // // return true; // //} // // // 尝试触发InputField事件 // if (TryTriggerInputFieldEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发InputField事件 - {uiObject.name}"); // return true; // } // // // 尝试触发Dropdown事件 // if (TryTriggerDropdownEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发Dropdown事件 - {uiObject.name}"); // return true; // } // // //// 尝试触发Scrollbar事件 // //if (TryTriggerScrollbarEvent(uiObject)) // //{ // // Debug.Log($"TutorialGuideManager: 成功触发Scrollbar事件 - {uiObject.name}"); // // return true; // //} // // //// 尝试触发ScrollRect事件 // //if (TryTriggerScrollRectEvent(uiObject)) // //{ // // Debug.Log($"TutorialGuideManager: 成功触发ScrollRect事件 - {uiObject.name}"); // // return true; // //} // // // 尝试触发RawImage事件 // if (TryTriggerRawImageEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发RawImage事件 - {uiObject.name}"); // return true; // } // // // 尝试触发Panel事件 // if (TryTriggerPanelEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发Panel事件 - {uiObject.name}"); // return true; // } // // // 尝试触发Canvas事件 // if (TryTriggerCanvasEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发Canvas事件 - {uiObject.name}"); // return true; // } // // // 尝试触发LayoutGroup事件 // if (TryTriggerLayoutGroupEvent(uiObject)) // { // Debug.Log($"TutorialGuideManager: 成功触发LayoutGroup事件 - {uiObject.name}"); // return true; // } // 如果没有找到支持的UI组件,记录警告 Debug.LogWarning($"TutorialGuideManager: UI对象 {uiObject.name} 不包含支持的UI组件类型"); return false; } catch (System.Exception ex) { Debug.LogError($"TutorialGuideManager: 触发UI事件时发生错误: {ex.Message}"); return false; } } /// /// 尝试触发Button事件 /// private bool TryTriggerButtonEvent(GameObject uiObject) { Button button = uiObject.GetComponent