Copy Paste GameObjects Hierarchy Transforms

Categories: Editor, Tech Art

This is just a quick EditorWindow Script to copy paste the position and rotation between two GameObject groups with the same hierarchy.

I like create EditorWindows. Actually this is how I got into coding. They are nice, and as long as they work, the performance cleanlyness of the code, and often I did not really completely understand what I was doing. It was a lot of try and error back then.

To call the EditorWindow, you need a MenuItem Attribute, and use a function to show it:

[MenuItem("Window/My Editor Window")]
    private static void Init()
    {
        MyEditorWindow window = (TransformHierarchyCopyPaster)EditorWindow.GetWindow(typeof(TransformHierarchyCopyPaster));
        window.Show();
    }

For referencing objects in the EditorWindow a ObjectPicker is needed, in this case its for GameObjects itself:

 obj = (GameObject) EditorGUILayout.ObjectField(obj, typeof(GameObject), true);

Simple reminder to check if some value has changed within the EditorWindow:

EditorGUI.BeginChangeCheck();

// Value that should be checked

if (EditorGUI.EndChangeCheck())
{
   // Do Stuff
}

Thats the code for the Tool.

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class TransformHierarchyCopyPaster : EditorWindow
{
    public GameObject obj = null;
    public GameObject newObj = null;
    public List<Transform> originalTransform = new List<Transform>();
    public List<Transform> newTransform = new List<Transform>();
    public string statusLabel = "Press Get Transform";

    [MenuItem("Artist Tools/Copy Paste Transform Hierarchy")]
    private static void Init()
    {
        TransformHierarchyCopyPaster window = (TransformHierarchyCopyPaster)EditorWindow.GetWindow(typeof(TransformHierarchyCopyPaster));
        window.Show();
    }

    private void OnGUI()
    {
        GUIStyle statusLabelStyle = new GUIStyle();

        EditorGUI.BeginChangeCheck();

        GUILayout.Label("Original", EditorStyles.boldLabel);
        obj = (GameObject) EditorGUILayout.ObjectField(obj, typeof(GameObject), true);

        GUILayout.Label("New", EditorStyles.boldLabel);
        newObj = (GameObject) EditorGUILayout.ObjectField(newObj, typeof(GameObject), true);
        
        GUILayout.Space(10);
        
        if (EditorGUI.EndChangeCheck())
        {
            statusLabel = "<color=yellow>Press Get Transform</color>";
        }
        
        GUILayout.Label(statusLabel, statusLabelStyle);
        
        
        if (GUILayout.Button("Get Transforms"))
        {
            originalTransform.Clear();
            newTransform.Clear();
            
            foreach (Transform child in obj.transform.GetComponentsInChildren<Transform>())
            {
                originalTransform.Add(child);
            }

            foreach (Transform child in newObj.transform.GetComponentsInChildren<Transform>())
            {
                newTransform.Add(child);
            }
            statusLabel = "<color=green>Ready to CopyPaste Transforms</color>";
        }

        if (GUILayout.Button("CopyPaste Transforms"))
        {
            for (int i = 0; i < originalTransform.Count; i++)
            {
                newTransform[i].position = originalTransform[i].position;
                newTransform[i].rotation = originalTransform[i].rotation;
            }
            Undo.RegisterCreatedObjectUndo(newObj, "Transform Changed");
        }
    }
}

Just to show what it does and how the Tool itself looks in a simple example.

«

    Leave a Reply

    Your email address will not be published.