Unity3d UnityEditor EditorWindow 自定义窗体控件

功能:是因为公司的模型组需要一个插件,在MAYA中有很多个复制物体,导出的时候只导出一个,其他相同的物体只导出点的位置信息。这样进入Unity里就是一个物体和N个相同物体的位置点,代码简单但是需要用插件形式,正好没研究过这方面,所以研究下Unity的插件编写。

网上的资料:http://blog.csdn.net/jjiss318/article/details/7435708

根据这篇文章,我做了个简易插件。大概思路是首先将所有带有位置信息的空物体在一个Tag下面获得,然后便利他们在他们的位置下实例化预制体。

首先建立个脚本DuplicatePrefabs。

注意要先添加UnityEditor;引用,以及继承EditorWindow

定义两个变量,一个Transform存储预制体,一个字符串存储Tag的名字


using System;
using UnityEngine;
using UnityEditor;


public class DuplicatePrefabs : EditorWindow
{
    public Transform PrefabObj;
    public string TagName="Locator";

    private GameObject[] objs;

    //设置插件在菜单栏的位置   和快捷键
    [MenuItem("Window/DuplicatePrefabs %Q")]
    //实例化窗体
    static void Init()
    {
        DuplicatePrefabs window = (DuplicatePrefabs)EditorWindow.GetWindow(typeof(DuplicatePrefabs));
        window.Show();
    }
    //用GUI画出窗体的空间布局
    void OnGUI()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("预制体", EditorStyles.boldLabel);
        PrefabObj = EditorGUILayout.ObjectField(PrefabObj, typeof(Transform)) as Transform;
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        GUILayout.Label("标签名称",EditorStyles.boldLabel);
        TagName = EditorGUILayout.TextField(TagName,EditorStyles.boldLabel);
        GUILayout.EndHorizontal();
        if (GUILayout.Button("应用"))
        {
            fnDuplicate();
        }
    }
    /// <summary>
    /// 便利Tag下物体并实例化
    /// </summary>
    void fnDuplicate()
    {
        objs = GameObject.FindGameObjectsWithTag(TagName);
        foreach(GameObject obj in objs)
        {
            Instantiate(PrefabObj, obj.transform.position, obj.transform.rotation);
        }
    }
  
}
这样,等Unity加载完脚本后在Window下就会出现这个类,点击后就出现了窗体,然后将预制体拖入,填入需要实例化的空物体的标签就可批量实例化相同物体。



posted @ 2014-10-30 14:19  三年二班小黄花  阅读(1110)  评论(0编辑  收藏  举报