Как вставить значения свойств хранимых компонентов в другой проект, а также как отформатировать свойства в строке []? - PullRequest
1 голос
/ 03 апреля 2020

В одном проекте у меня есть скрипт окна редактора с копией:

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

И если я копирую все serializedData, находящиеся в CopyBuffer очистить текстовый файл блокнота:

Notepad

И я хочу как-то отформатировать serializedData, чтобы она выглядела как компоненты, например компоненты [0] content:

components[0] content

Так что, когда вставляете что-то в 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);
                }
            }

Но как я могу добавить их в том же порядке и расположить как дочерние, когда вставить это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...