fk
This commit is contained in:
3
Assets/Scripts/Editor/Preview.meta
Normal file
3
Assets/Scripts/Editor/Preview.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 64b3d51f8cb04af485e1a07f8a6e15a5
|
||||
timeCreated: 1750822352
|
||||
204
Assets/Scripts/Editor/Preview/PreviewEditWindow.cs
Normal file
204
Assets/Scripts/Editor/Preview/PreviewEditWindow.cs
Normal file
@@ -0,0 +1,204 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace NBF
|
||||
{
|
||||
public class PreviewableAssetEditor : EditorWindow
|
||||
{
|
||||
private List<GameObject> previewablePrefabs = new List<GameObject>();
|
||||
private Vector2 scrollPosition;
|
||||
private int selectedIndex = -1;
|
||||
private GameObject selectedPrefab;
|
||||
private Editor prefabEditor;
|
||||
private SerializedObject serializedObject;
|
||||
|
||||
[MenuItem("Tools/Previewable Asset Editor")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
GetWindow<PreviewableAssetEditor>("Previewable Assets");
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
RefreshPrefabList();
|
||||
}
|
||||
|
||||
private void RefreshPrefabList()
|
||||
{
|
||||
previewablePrefabs.Clear();
|
||||
|
||||
// 查找项目中所有预制体
|
||||
string[] guids = AssetDatabase.FindAssets("t:Prefab");
|
||||
foreach (string guid in guids)
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
|
||||
|
||||
// 检查预制体是否有 PreviewableAsset 组件
|
||||
if (prefab.GetComponent<PreviewableAsset>() != null)
|
||||
{
|
||||
previewablePrefabs.Add(prefab);
|
||||
}
|
||||
}
|
||||
|
||||
// 按名称排序
|
||||
previewablePrefabs = previewablePrefabs.OrderBy(p => p.name).ToList();
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
|
||||
// 左侧列表
|
||||
DrawPrefabList();
|
||||
|
||||
// 右侧操作区域
|
||||
DrawOperationArea();
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
private void DrawPrefabList()
|
||||
{
|
||||
EditorGUILayout.BeginVertical(GUILayout.Width(250));
|
||||
|
||||
EditorGUILayout.LabelField("Previewable Assets", EditorStyles.boldLabel);
|
||||
EditorGUILayout.Space();
|
||||
|
||||
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, "box");
|
||||
|
||||
for (int i = 0; i < previewablePrefabs.Count; i++)
|
||||
{
|
||||
var prefab = previewablePrefabs[i];
|
||||
bool isSelected = i == selectedIndex;
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
|
||||
// 使用 toggle 样式按钮来模拟选择
|
||||
if (GUILayout.Toggle(isSelected, prefab.name, "Button", GUILayout.Height(20)))
|
||||
{
|
||||
if (!isSelected)
|
||||
{
|
||||
selectedIndex = i;
|
||||
selectedPrefab = prefab;
|
||||
CreatePrefabEditor();
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
EditorGUILayout.EndScrollView();
|
||||
|
||||
// 刷新按钮
|
||||
if (GUILayout.Button("Refresh List"))
|
||||
{
|
||||
RefreshPrefabList();
|
||||
selectedIndex = -1;
|
||||
selectedPrefab = null;
|
||||
prefabEditor = null;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
|
||||
private void DrawOperationArea()
|
||||
{
|
||||
EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true));
|
||||
|
||||
if (selectedPrefab == null)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Select a prefab from the list to edit its PreviewableAsset properties.",
|
||||
MessageType.Info);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.LabelField("Editing: " + selectedPrefab.name, EditorStyles.boldLabel);
|
||||
EditorGUILayout.Space();
|
||||
|
||||
// 显示预制体预览
|
||||
if (prefabEditor != null)
|
||||
{
|
||||
prefabEditor.OnPreviewGUI(GUILayoutUtility.GetRect(100, 100), EditorStyles.helpBox);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
// 显示 PreviewableAsset 属性
|
||||
var previewableAsset = selectedPrefab.GetComponent<PreviewableAsset>();
|
||||
if (previewableAsset != null)
|
||||
{
|
||||
if (serializedObject == null || serializedObject.targetObject != previewableAsset)
|
||||
{
|
||||
serializedObject = new SerializedObject(previewableAsset);
|
||||
}
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
// 自动绘制所有序列化字段
|
||||
SerializedProperty prop = serializedObject.GetIterator();
|
||||
bool enterChildren = true;
|
||||
while (prop.NextVisible(enterChildren))
|
||||
{
|
||||
enterChildren = false;
|
||||
if (prop.name == "m_Script") continue; // 跳过脚本引用
|
||||
EditorGUILayout.PropertyField(prop, true);
|
||||
}
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
// 保存按钮
|
||||
if (GUILayout.Button("Save Changes", GUILayout.Height(30)))
|
||||
{
|
||||
SaveChanges();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.HelpBox("Selected prefab no longer has a PreviewableAsset component.",
|
||||
MessageType.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
|
||||
private void CreatePrefabEditor()
|
||||
{
|
||||
if (prefabEditor != null)
|
||||
{
|
||||
DestroyImmediate(prefabEditor);
|
||||
}
|
||||
|
||||
prefabEditor = Editor.CreateEditor(selectedPrefab);
|
||||
}
|
||||
|
||||
private void SaveChanges()
|
||||
{
|
||||
if (selectedPrefab != null)
|
||||
{
|
||||
// 标记预制体为脏以便保存
|
||||
EditorUtility.SetDirty(selectedPrefab);
|
||||
|
||||
// 保存预制体
|
||||
AssetDatabase.SaveAssets();
|
||||
AssetDatabase.Refresh();
|
||||
|
||||
Debug.Log("Prefab " + selectedPrefab.name + " saved successfully.");
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (prefabEditor != null)
|
||||
{
|
||||
DestroyImmediate(prefabEditor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Scripts/Editor/Preview/PreviewEditWindow.cs.meta
Normal file
3
Assets/Scripts/Editor/Preview/PreviewEditWindow.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9fe1f9c26314412880e299b87d998083
|
||||
timeCreated: 1750822614
|
||||
Reference in New Issue
Block a user