Files
tools/Unity C++脚本/ReplaceWithPrefabWindow.cs
2025-08-01 10:50:57 +08:00

72 lines
2.2 KiB
C#

using UnityEngine;
using UnityEditor;
public class ReplaceWithPrefabWindow : EditorWindow
{
private GameObject _prefab;
private bool inheritPosition = true;
private bool inheritScale = true;
private bool inheritRotation = true;
[MenuItem("Tools/Replace Selected with Prefab")]
static void ShowWindow()
{
GetWindow<ReplaceWithPrefabWindow>("Replace With Prefab");
}
private void OnGUI()
{
GUILayout.Label("Select Prefab to Replace With", EditorStyles.boldLabel);
_prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", _prefab, typeof(GameObject), false);
inheritPosition = EditorGUILayout.Toggle("Inherit Position", inheritPosition);
inheritRotation = EditorGUILayout.Toggle("Inherit Rotation", inheritRotation);
inheritScale = EditorGUILayout.Toggle("Inherit Scale", inheritScale);
if (GUILayout.Button("Replace"))
{
ReplaceSelectedObjects();
}
}
private void ReplaceSelectedObjects()
{
if (_prefab == null)
{
Debug.LogWarning("No prefab selected.");
return;
}
if (Selection.gameObjects.Length == 0)
{
Debug.LogWarning("No objects selected.");
return;
}
GameObject[] selectedObjects = Selection.gameObjects;
foreach (GameObject selectedObject in selectedObjects)
{
// 创建新对象并记录到撤销历史
GameObject newObject = (GameObject)PrefabUtility.InstantiatePrefab(_prefab);
Undo.RegisterCreatedObjectUndo(newObject, "Replace with Prefab");
newObject.transform.SetParent(selectedObject.transform.parent);
// 继承属性
if (inheritPosition)
newObject.transform.position = selectedObject.transform.position;
if (inheritRotation)
newObject.transform.rotation = selectedObject.transform.rotation;
if (inheritScale)
newObject.transform.localScale = selectedObject.transform.localScale;
// 删除原始对象并记录到撤销历史
Undo.DestroyObjectImmediate(selectedObject);
}
}
}