baobao
10/18/2016 - 2:20 PM

サクッとオブジェクト同士を階層化させるエディタ拡張。GameObjectは非対応です

サクッとオブジェクト同士を階層化させるエディタ拡張。GameObjectは非対応です

using UnityEngine;
using System.Collections;
using UnityEditor;

/// <summary>
/// サクッとオブジェクト同士を階層化させるエディタ拡張。GameObjectは非対応です
/// </summary>
public class ContainWindow: EditorWindow
{
    [MenuItem("Window/ContainWindow")]
    private static void Init ()
    {
        var w = EditorWindow.GetWindow <ContainWindow> ();
        w.titleContent = new GUIContent ("ContainWindow");
        w.Show ();
    }

    private Object _parent;
    private Object _childObj;
    private Object _deleteObj;

    private void OnGUI ()
    {
        EditorGUILayout.LabelField ("サクッとオブジェクト同士を階層化させます");
        EditorGUILayout.Space ();
        EditorGUILayout.LabelField ("親オブジェクト");
        _parent = EditorGUILayout.ObjectField (_parent, typeof(Object), false) as Object;
        EditorGUILayout.LabelField ("子供にするオブジェクト");
        _childObj = EditorGUILayout.ObjectField (_childObj, typeof(Object), true) as Object;
        EditorGUILayout.LabelField ("削除したいオブジェクト");
        _deleteObj = EditorGUILayout.ObjectField (_deleteObj, typeof(Object), true) as Object;
        if (_deleteObj != null)
        {
            if (GUILayout.Button ("Delete", GUILayout.Height (30f)))
            {
                Object.DestroyImmediate (_deleteObj, true);
                AssetDatabase.Refresh ();
                AssetDatabase.SaveAssets ();
            }
        }

        if (Varidate() == false)
        {
            return;
        }

        EditorGUILayout.LabelField("子オブジェクトがコピーされて親子関係になります");

        if (GUILayout.Button ("Start Contain", GUILayout.Height (30f)))
        {
            var obj = Instantiate(_childObj);
            // Remove name "(Clone)"
            obj.name = _childObj.name;
            AssetDatabase.AddObjectToAsset (obj, AssetDatabase.GetAssetPath (_parent));
            AssetDatabase.ImportAsset (AssetDatabase.GetAssetPath (_parent));
            AssetDatabase.Refresh ();
            AssetDatabase.SaveAssets ();
        }
    }

    private bool Varidate()
    {
        if (_parent == null || _childObj == null)
        {
            return false;
        }

        if (_parent is GameObject)
        {
            _parent = null;
            return false;
        }
        if (_childObj is GameObject)
        {
            _childObj = null;
            return false;
        }

        if (_parent == _childObj)
        {
            _childObj = null;
            return false;
        }

        return true;
    }
}