Unity3d UnityEditor EditorWindow 自定义窗体控件

来源:互联网 发布:4g流量3g网络可以用吗 编辑:程序博客网 时间:2024/06/05 17:57

功能:是因为公司的模型组需要一个插件,在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下就会出现这个类,点击后就出现了窗体,然后将预制体拖入,填入需要实例化的空物体的标签就可批量实例化相同物体。



0 0