#if UNITY_EDITOR using System.Text; using UnityEditor; using UnityEngine; namespace SLSUtilities.FunctionalAnimation { public class FuncAnimInteractionsGuideWindow : EditorWindow { private Vector2 scrollPosition; public static void ShowWindow() { FuncAnimInteractionsGuideWindow window = GetWindow(true, "FuncAnim Interactions 使用说明"); window.minSize = new Vector2(560f, 360f); window.Show(); } private void OnGUI() { scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); EditorGUILayout.LabelField("FuncAnim Interactions 使用说明", EditorStyles.boldLabel); EditorGUILayout.Space(8f); DrawSection( FuncAnimInteractionKeys.SpecifiedActionDisruption, "用途:限制当前动作只能在指定的 Custom Interval 内被特定动作打断。", "配置:在当前 FuncAnimData 的 intervals 中添加 Custom interval,intervalName 必须为 SpecifiedActionDisruption;然后在 interactions 中添加 Key = SpecifiedActionDisruption。", "Values:填写允许打断当前动作的新动作 animationName。", "运行时效果:如果新动作在 Values 中,只有当前时间处于 SpecifiedActionDisruption interval 时才能播放。"); DrawSection( FuncAnimInteractionKeys.ExemptedPayloadAnimPairOnSelfOverrideDisruption, "用途:当前动作被 SelfOverride 切换到指定动作时,跳过指定的 disruption payload。", "Values 格式:PayloadEventName:TargetAnimationName。", "PayloadEventName 是当前动作 disruptionEvents 中要跳过的 payload eventName。如果 payload 没有 eventName,也可以填写 payload 类型显示名;TargetAnimationName 是即将播放的新动作 animationName。", "可以使用 *:TargetAnimationName 跳过切换到该动作时的全部 disruption payload。", "典型用法:FutureWand 的 HoldAttackStart -> HoldAttackLoop 是正常蓄力链路,不应清理蓄力 VFX;但 HoldAttackStart -> Dash/Dodge 仍应清理。"); EditorGUILayout.EndScrollView(); } private static void DrawSection(string title, params string[] lines) { EditorGUILayout.LabelField(title, EditorStyles.boldLabel); StringBuilder description = new StringBuilder(); for (int i = 0; i < lines.Length; i++) { if (i > 0) { description.AppendLine(); } description.Append(lines[i]); } EditorGUILayout.HelpBox(description.ToString(), MessageType.None); EditorGUILayout.Space(10f); } } } #endif