using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace AibisDream.FrameAnimation.Editor { [CustomEditor(typeof(FrameClipPlayer))] public sealed class FrameClipPlayerEditor : UnityEditor.Editor { public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("clip")); EditorGUILayout.PropertyField(serializedObject.FindProperty("playOnEnable")); EditorGUILayout.PropertyField(serializedObject.FindProperty("speed")); DrawWarnings(); serializedObject.ApplyModifiedProperties(); if (!Application.isPlaying) return; var player = (FrameClipPlayer)target; EditorGUILayout.Space(); EditorGUILayout.LabelField("Runtime State", EditorStyles.boldLabel); using (new EditorGUI.DisabledScope(true)) { EditorGUILayout.EnumPopup("State", player.State); EditorGUILayout.ObjectField("Clip", player.CurrentClip, typeof(FrameClip), false); EditorGUILayout.TextField("Clip ID", player.CurrentClipId); EditorGUILayout.IntField("Frame", player.CurrentFrameIndex); } Repaint(); } private void DrawWarnings() { var player = (FrameClipPlayer)target; var renderer = player.GetComponent(); var image = player.GetComponent(); if (player.GetComponent() != null) EditorGUILayout.HelpBox("同一 GameObject 不能同时包含 FrameAnimationPlayer 和 FrameClipPlayer。", MessageType.Error); if (renderer == null && image == null) EditorGUILayout.HelpBox("同一 GameObject 上必须存在一个 SpriteRenderer 或 Image。", MessageType.Error); else if (renderer != null && image != null) EditorGUILayout.HelpBox("同一 GameObject 不能同时存在 SpriteRenderer 和 Image。", MessageType.Error); if (serializedObject.FindProperty("clip").objectReferenceValue == null) EditorGUILayout.HelpBox("尚未绑定默认 FrameClip;仍可通过 Play(FrameClip) 临时播放。", MessageType.Info); var value = serializedObject.FindProperty("speed").floatValue; if (!FrameAnimationValueUtility.IsValidSpeed(value)) EditorGUILayout.HelpBox("Speed 必须是有限且不小于 0 的数值。", MessageType.Error); } } }