diff --git a/Assets/Scripts/UI/Components/DreamTerminalUI.cs b/Assets/Scripts/UI/Components/DreamTerminalUI.cs index f80b2e7fb..1e2fb04c5 100644 --- a/Assets/Scripts/UI/Components/DreamTerminalUI.cs +++ b/Assets/Scripts/UI/Components/DreamTerminalUI.cs @@ -130,7 +130,6 @@ namespace AibisDream.UI private string _inputBuffer = ""; private bool _cursorVisible = true; private Coroutine _crashSpamCoroutine; - private double _editorLastRepaintTime; // 全局 alpha(用于 DreamDoorSystem 淡入淡出) public float Alpha { get; set; } = 0f; @@ -154,12 +153,6 @@ namespace AibisDream.UI private void Update() { - if (!Application.isPlaying) - { - UpdateEditorPreview(); - return; - } - if (_phase == TerminalPhase.WaitingInput) HandleTypingInput(); else if (_phase == TerminalPhase.Confirming) @@ -178,17 +171,16 @@ namespace AibisDream.UI base.OnEnable(); EnsureDefaultFontReference(); +#if UNITY_EDITOR if (!Application.isPlaying) - ApplyEditorPreviewState(); + EditorRunPreviewTick(); +#endif } private void OnValidate() { EnsureDefaultFontReference(); MorphProgress = morphProgress; - - if (!Application.isPlaying) - ApplyEditorPreviewState(); } #endregion @@ -231,33 +223,6 @@ namespace AibisDream.UI return Vector2.Lerp(morphStartSize, terminalSize, frameProgress); } - [ContextMenu("Preview/Frame Only")] - private void PreviewFrameOnly() - { - previewInEditor = true; - previewStage = PreviewStage.FrameOnly; - previewAlpha = 1f; - previewMorphProgress = 0.65f; - ApplyEditorPreviewState(); - } - - [ContextMenu("Preview/Waiting Input")] - private void PreviewWaitingInput() - { - previewInEditor = true; - previewStage = PreviewStage.WaitingInput; - previewAlpha = 1f; - previewMorphProgress = 1f; - ApplyEditorPreviewState(); - } - - [ContextMenu("Preview/Clear")] - private void ClearPreview() - { - previewInEditor = false; - ApplyEditorPreviewState(); - } - #endregion #region Shapes 绘制(DrawShapes 覆写) @@ -876,7 +841,7 @@ namespace AibisDream.UI public float delayAfter; } - private enum PreviewStage + public enum PreviewStage { Hidden, FrameOnly, @@ -898,7 +863,10 @@ namespace AibisDream.UI #endregion #if UNITY_EDITOR - private void UpdateEditorPreview() + private double _editorLastRepaintTime; + + /// 仅编辑器:由 DreamTerminalUIEditor(CustomEditor)在需要时调用。 + public void EditorRunPreviewTick() { ApplyEditorPreviewState(); diff --git a/Assets/Scripts/UI/Editor.meta b/Assets/Scripts/UI/Editor.meta new file mode 100644 index 000000000..50677ed63 --- /dev/null +++ b/Assets/Scripts/UI/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 476765c2f1febfa46abc793693aafa81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs b/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs new file mode 100644 index 000000000..0c99f758b --- /dev/null +++ b/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs @@ -0,0 +1,107 @@ +using AibisDream.UI; +using UnityEditor; +using UnityEngine; + +namespace AibisDream.UI.Editor +{ + [CustomEditor(typeof(DreamTerminalUI))] + [CanEditMultipleObjects] + internal sealed class DreamTerminalUIEditor : UnityEditor.Editor + { + void OnEnable() + { + EditorApplication.update += OnEditorUpdate; + RefreshAllTargets(); + } + + void OnDisable() + { + EditorApplication.update -= OnEditorUpdate; + } + + void OnEditorUpdate() + { + if (Application.isPlaying) + return; + + RefreshAllTargets(); + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUI.BeginChangeCheck(); + DrawDefaultInspector(); + bool changed = EditorGUI.EndChangeCheck(); + + serializedObject.ApplyModifiedProperties(); + + if (changed) + RefreshAllTargets(); + + EditorGUILayout.Space(); + using (new EditorGUILayout.HorizontalScope()) + { + if (GUILayout.Button("Preview / Frame Only")) + ApplyPreset(PreviewPreset.FrameOnly); + + if (GUILayout.Button("Preview / Waiting Input")) + ApplyPreset(PreviewPreset.WaitingInput); + } + + if (GUILayout.Button("Preview / Clear")) + ApplyPreset(PreviewPreset.Clear); + } + + enum PreviewPreset + { + FrameOnly, + WaitingInput, + Clear + } + + void ApplyPreset(PreviewPreset preset) + { + Undo.RecordObjects(targets, "Dream Terminal Preview Preset"); + + foreach (Object o in targets) + { + var ui = (DreamTerminalUI)o; + SerializedObject so = new SerializedObject(ui); + + switch (preset) + { + case PreviewPreset.FrameOnly: + so.FindProperty("previewInEditor").boolValue = true; + so.FindProperty("previewStage").enumValueIndex = (int)DreamTerminalUI.PreviewStage.FrameOnly; + so.FindProperty("previewAlpha").floatValue = 1f; + so.FindProperty("previewMorphProgress").floatValue = 0.65f; + break; + case PreviewPreset.WaitingInput: + so.FindProperty("previewInEditor").boolValue = true; + so.FindProperty("previewStage").enumValueIndex = (int)DreamTerminalUI.PreviewStage.WaitingInput; + so.FindProperty("previewAlpha").floatValue = 1f; + so.FindProperty("previewMorphProgress").floatValue = 1f; + break; + case PreviewPreset.Clear: + so.FindProperty("previewInEditor").boolValue = false; + break; + } + + so.ApplyModifiedProperties(); + ui.EditorRunPreviewTick(); + } + } + + void RefreshAllTargets() + { + foreach (Object o in targets) + { + var ui = o as DreamTerminalUI; + if (ui != null) + ui.EditorRunPreviewTick(); + } + } + } +} diff --git a/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs.meta b/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs.meta new file mode 100644 index 000000000..4770c8ea5 --- /dev/null +++ b/Assets/Scripts/UI/Editor/DreamTerminalUIEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 747d2c6e1751ca44ca1dc64512027f8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: