using System.Linq; using UnityEditor; using UnityEngine; namespace AibisDream.FrameAnimation.Editor { [CustomEditor(typeof(FrameClip))] public sealed class FrameClipEditor : UnityEditor.Editor { public override void OnInspectorGUI() { var clip = (FrameClip)target; var owners = FrameAnimationAssetReferenceIndex.FindGraphsReferencing(clip); var kind = clip.IsImported ? "Graph Imported FrameClip" : clip.HasStandaloneImportSource ? "Source-linked External FrameClip" : "Manual FrameClip"; EditorGUILayout.LabelField(kind, EditorStyles.boldLabel); using (new EditorGUI.DisabledScope(true)) { EditorGUILayout.TextField("ID", clip.Id); EditorGUILayout.TextField("Display Name", clip.DisplayName); EditorGUILayout.FloatField("Speed", clip.Speed); EditorGUILayout.EnumPopup("Default End", clip.DefaultEndBehavior); EditorGUILayout.IntField("Frames", clip.FrameCount); EditorGUILayout.LongField("Total Duration Ms", clip.TotalDurationMs); EditorGUILayout.TextField("Storage", AssetDatabase.IsSubAsset(clip) ? "Graph sub-asset" : "External .asset"); EditorGUILayout.TextField("Source Tag", clip.ImportInfo?.SourceTagName ?? string.Empty); EditorGUILayout.Toggle("Missing", clip.ImportInfo?.IsMissingFromSource ?? false); EditorGUILayout.ObjectField("Standalone Texture", clip.StandaloneImportSource?.Texture, typeof(Texture2D), false); EditorGUILayout.ObjectField("Standalone JSON", clip.StandaloneImportSource?.AsepriteJson, typeof(TextAsset), false); } if (!AssetDatabase.IsSubAsset(clip) && owners.Count > 1) { EditorGUILayout.HelpBox( "该外部 Manual Clip 被多个 Graph 共享:" + string.Join(", ", owners.Select(graph => graph.name)), MessageType.Warning); } EditorGUILayout.HelpBox( AssetDatabase.IsSubAsset(clip) ? "Graph sub-asset 的 Clip 数据请在 Frame Animation Graph Editor 中编辑。" : "双击资产或使用下方按钮,在独立 Frame Clip Editor 中编辑。", MessageType.Info); if (!AssetDatabase.IsSubAsset(clip) && GUILayout.Button("Open Frame Clip Editor")) { FrameClipEditorWindow.Open(clip); } if (owners.Count == 0) { EditorGUILayout.HelpBox("当前没有 FrameAnimationGraph 引用该 Clip。", MessageType.Info); } else if (owners.Count == 1) { if (GUILayout.Button("Open Referencing Graph")) { FrameAnimationGraphEditorWindow.Open(owners[0]); } } else if (GUILayout.Button("Choose Referencing Graph")) { var menu = new GenericMenu(); foreach (var owner in owners) { var captured = owner; menu.AddItem(new GUIContent(owner.name), false, () => FrameAnimationGraphEditorWindow.Open(captured)); } menu.ShowAsContext(); } } } }