В одном проекте у меня есть скрипт окна редактора с копией:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Reflection;
using UnityEditorInternal;
using System.Text;
using System.Linq;
public class EditorWindowCopyComponentsData : EditorWindow
{
[MenuItem("GameObject/Copy Components", false, 20)]
public static void CopyComponents(MenuCommand command)
{
var go = Selection.activeGameObject;//command.context as GameObject;
var components = go.GetComponents<Component>().ToList();
foreach (Transform child in go.transform)
{
foreach (Component component in child.GetComponents<Component>())
{
components.Add(component);
}
}
var serializedData = new string[components.Count];
for (int i = 0; i < components.Count; i++)
{
// Type-AssemblyQualifiedName : Json-Serialized-Data
serializedData[i] = components[i].GetType().AssemblyQualifiedName + ":" + EditorJsonUtility.ToJson(components[i]);
}
EditorGUIUtility.systemCopyBuffer = string.Join("\n", serializedData);
}
}
Когда я использую точку останова и наведу указатель мыши на serializedData, я вижу свойства 6 компонентов и значения свойств но они различаются по формату, например, снимок экрана содержимого serializedData [0]:
![serializedData[0] content](https://i.stack.imgur.com/8XpDE.jpg)
И если я копирую все serializedData, находящиеся в CopyBuffer очистить текстовый файл блокнота:
![Notepad](https://i.stack.imgur.com/WKBJz.jpg)
И я хочу как-то отформатировать serializedData, чтобы она выглядела как компоненты, например компоненты [0] content:
![components[0] content](https://i.stack.imgur.com/PJCgU.jpg)
Так что, когда вставляете что-то в CopyBuffer, например, в Блокнот, формат должен быть, например:
Component[0]
Properties :
childCount = 1
eulerAngles = "(12.8, 179.1, 0.0)"
И так далее .. Затем
Component[1]
Properties :
etc....= 45546
etc property = fsdfsdf
Этот формат, как в компонентах И добавить для опции также добавить дополнительные свойства в Copybuffer или в формат, например, для свойства eulerAngles на левой стороне есть небольшой стрелка и если навести на нее мышь, она покажет некоторые свойства и значения более глубокого уровня, чтобы можно было форматировать и как их копировать в CopyBuffer при копировании компонентов.
Вторая проблема заключается в том, когда выполняется вставка в другой проект:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Reflection;
using UnityEditorInternal;
using System;
public class EditorWindowCopyComponentsData : EditorWindow
{
[MenuItem("GameObject/Paste Components", false, 21)]
public static void PasteComponents(MenuCommand command)
{
var go = Selection.activeGameObject;//command.context as GameObject;
var serializedData = EditorGUIUtility.systemCopyBuffer.Split('\n');
char[] splitter = { ':' };
foreach (var data in serializedData)
{
var typeAndJson = data.Split(splitter, 2);
var type = Type.GetType(typeAndJson[0]);
if (type.FullName == "UnityEngine.Transform") // only 1 transform
{
EditorJsonUtility.FromJsonOverwrite(typeAndJson[1], go.transform);
}
else
{
EditorJsonUtility.FromJsonOverwrite(typeAndJson[1], go.AddComponent(type));
}
}
}
}
Он не будет помещать дочерние компоненты как дочерние элементы 'go', как при копировании. В этой копии я также поверх дочерних компонентов добавляю их в список компонентов и копирую их тоже:
foreach (Transform child in go.transform)
{
foreach (Component component in child.GetComponents<Component>())
{
components.Add(component);
}
}
Но как я могу добавить их в том же порядке и расположить как дочерние, когда вставить это?