Есть ли способ использовать редактор окна и сохранить скопированный компонент в памяти (буфер обмена)? - PullRequest
0 голосов
/ 31 марта 2020
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Reflection;
using UnityEditorInternal;

public class EditorWindowCopyComponentsData : EditorWindow
{
    static Component[] storedComponents;

    [MenuItem("SmartCopy/ Copy all Components")]
    private static void CopyAllComponents()
    {
        if (Selection.gameObjects.Length != 0)
        {
            storedComponents = Selection.activeGameObject.GetComponents<Component>();
        }
        else
        {
            Debug.Log("Please select GameObject to copy components from.");
        }
    }

    [MenuItem("SmartCopy/ Paste all Components")]
    private static void PasteAllComponents()
    {
        if (Selection.gameObjects.Length != 0)
        {
            if (storedComponents != null)
            {
                foreach (GameObject targetObject in Selection.gameObjects)
                {
                    foreach (Component targetComponent in storedComponents)
                    {
                        ComponentUtility.CopyComponent(targetComponent);
                        ComponentUtility.PasteComponentAsNew(targetObject);
                    }
                }
                return;
            }

            Debug.Log("No Component to copy.");
            return;
        }

        Debug.Log("No GameObject Selected to paste Components.");
    }

    [MenuItem("SmartCopy/ Delete all Components")]
    private static void DeleteAllComponents()
    {
        foreach (Component targetComponent in Selection.activeGameObject.GetComponents<Component>())
        {
            DestroyImmediate(targetComponent);
        }
    }

    [MenuItem("SmartCopy/ Paste Difference")]
    private static void CopyDifference()
    {
        Debug.Log("Under Construction=====");
    }

    private static bool FillerFunc(Component c)
    {
        return true;
    }
}

Я не хочу копировать игровой объект из иерархии, а компоненты игрового объекта. Это работает нормально в том же проекте, но есть ли способ сохранить компонент (ы) также в некотором буфере памяти, может быть, буфер обмена и использовать скрипт в другом проекте, чтобы скопировать компонент (ы) в другой игровой объект в другом проекте?

Может быть, есть необходимость сначала создать / добавить компоненты в другом проекте, а затем сделать копию не совсем уверенной.

Или, возможно, записать в текстовый файл имена сохраненных компонентов, а затем каждый настройки и значения компонентов, а затем считывание информации в другом проекте, создание компонентов по именам и запись настроек и значений в компонент / ы?

Идея состоит в том, чтобы скопировать значения компонентов / с или компонентов / с между проектами.

Снимок экрана:

Copy component

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать EditorJsonUtility для сериализации и десериализации компонентов.

Убедитесь, что свойство guid ресурсов между проектами одинаковое, в противном случае ссылка будет разорвана после вставки.

Копия:

[MenuItem("GameObject/Copy Components", false, 20)]
public static void CopyComponents(MenuCommand command)
{
    var go = command.context as GameObject;
    var components = go.GetComponents<Component>();
    var serializedData = new string[components.Length];
    for (int i = 0; i < components.Length; i++)
        // Type-AssemblyQualifiedName : Json-Serialized-Data
        serializedData[i] = components[i].GetType().AssemblyQualifiedName + ":" + EditorJsonUtility.ToJson(components[i]);
    EditorGUIUtility.systemCopyBuffer = string.Join("\n", serializedData);
}

Вставить:

[MenuItem("GameObject/Paste Components", false, 21)]
public static void PasteComponents(MenuCommand command)
{
    var go = 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));
    }
}

Скрытый ребенок от видеокамеры:

hidden child

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