https://www.xuanyusong.com/archives/category/unity/unity3deditor

1

using UnityEngine;

public class Test : MonoBehaviour {
    public Rect rect;
    public Texture texture;
}

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class MyEditor: Editor {
    public override void OnInspectorGUI() {
        Test test = (Test)target;
        test.rect = EditorGUILayout.RectField("窗口坐标", test.rect);
        test.texture = EditorGUILayout.ObjectField("增加一个贴图", test.texture, typeof(Texture), true) as Texture;
    }
}

2

using UnityEngine;
using UnityEditor;

public class MyEditor: EditorWindow {

    private string text;
    private Texture texture;

    [MenuItem("GameObject/window")]
    public static void AddWindow() {
        Rect rect = , , , );
        MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect(typeof(MyEditor), rect, true, "window one");
        window.Show();
    }

    public void OnGUI() {
        text = EditorGUILayout.TextField("输入文字:", text);

        ))) {
            ShowNotification(new GUIContent("This is a Notification"));
        }

        ))) {
            this.RemoveNotification();
        }

        EditorGUILayout.LabelField("鼠标在窗口的位置", Event.current.mousePosition.ToString());

        texture = EditorGUILayout.ObjectField("添加贴图", texture, typeof(Texture), true) as Texture;

        ))) {
            Close();
        }
    }

    public void OnFocus() {
        Debug.Log("当窗口获得焦点时调用一次");
    }

    public void OnLostFocus() {
        Debug.Log("当窗口丢失焦点时调用一次");
    }

    public void OnHierarchyChange() {
        Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");
    }

    public void OnProjectChange() {
        Debug.Log("当Project视图中的资源发生改变时调用一次");
    }

    public void OnInspectorUpdate() {
        // Debug.Log("窗口面板的更新");
        // 这里开启窗口的重绘,不然窗口信息不会刷新
        this.Repaint();
    }

    public void OnSelectionChange() {
        foreach (Transform t in Selection.transforms) {
            Debug.Log("OnSelectionChange: " + t.name);
        }
    }

    public void OnDestroy() {
        Debug.Log("当窗口关闭时调用");
    }
}

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Test))]
public class MyEditor: Editor {

    public void OnSceneGUI() {
        Test test = (Test)target;

        Handles.Label(test.transform.position + Vector3.up * , test.transform.name + " : " + test.transform.position.ToString());
        Handles.BeginGUI();

        GUILayout.BeginArea(, , , ));

        if (GUILayout.Button("这是一个按钮!")) {
            Debug.Log("test");
        }

        GUILayout.Label("我在编辑Scene视图");

        GUILayout.EndArea();

        Handles.EndGUI();
    }
}
using UnityEngine;
using UnityEditor;

public class MyEditor: Editor {

    [DrawGizmo(GizmoType.InSelectionHierarchy | GizmoType.NotInSelectionHierarchy)]
    public static void DrawGameObjectName(Transform transform, GizmoType gizmoType) {
        Handles.Label(transform.position, transform.gameObject.name);
    }
}

using UnityEngine;
using UnityEditor;

public class MyEditor: Editor {

    [MenuItem("MyMenu/Do Test")]
    public static void Test() {
        Transform parent = Selection.activeGameObject.transform;
        Vector3 postion = parent.position;
        Quaternion rotation = parent.rotation;
        Vector3 scale = parent.localScale;
        parent.position = Vector3.zero;
        parent.rotation = Quaternion.Euler(Vector3.zero);
        parent.localScale = Vector3.one;

        Collider[] colliders = parent.GetComponentsInChildren<Collider>();
        foreach (Collider child in colliders) {
            DestroyImmediate(child);
        }
        Vector3 center = Vector3.zero;
        Renderer[] renders = parent.GetComponentsInChildren<Renderer>();
        foreach (Renderer child in renders) {
            center += child.bounds.center;
        }
        center /= parent.transform.childCount;
        Bounds bounds = new Bounds(center, Vector3.zero);
        foreach (Renderer child in renders) {
            bounds.Encapsulate(child.bounds);
        }
        BoxCollider boxCollider = parent.gameObject.AddComponent<BoxCollider>();
        boxCollider.center = bounds.center - parent.position;
        boxCollider.size = bounds.size;

        parent.position = postion;
        parent.rotation = rotation;
        parent.localScale = scale;
    }

}

5

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

[CustomEditor(typeof(UnityEditor.DefaultAsset))]
public class FolderInspector : Editor {

    Data data;
    Data selectData;

    void OnEnable() {
        if (Directory.Exists(AssetDatabase.GetAssetPath(target))) {
            data = new Data();
            LoadFiles(data, AssetDatabase.GetAssetPath(Selection.activeObject));
        }

    }
    public override void OnInspectorGUI() {

        if (Directory.Exists(AssetDatabase.GetAssetPath(target))) {
            GUI.enabled = true;
            EditorGUIUtility.SetIconSize(Vector2.one * );
            DrawData(data);
        }

    }

    ) {
        GUIContent content = GetGUIContent(currentPath);

        if (content != null) {
            data.indent = indent;
            data.content = content;
            data.assetPath = currentPath;

        }

        foreach (var path in Directory.GetFiles(currentPath)) {
            content = GetGUIContent(path);
            if (content != null) {
                Data child = new Data();
                child.indent = indent + ;
                child.content = content;
                child.assetPath = path;
                data.childs.Add(child);
            }
        }

        foreach (var path in Directory.GetDirectories(currentPath)) {
            Data childDir = new Data();
            data.childs.Add(childDir);
            LoadFiles(childDir, path, indent + );
        }
    }

    void DrawData(Data data) {
        if (data.content != null) {
            EditorGUI.indentLevel = data.indent;
            DrawGUIData(data);

        }
        ; i < data.childs.Count; i++) {
            Data child = data.childs[i];
            if (child.content != null) {
                EditorGUI.indentLevel = child.indent;
                )
                    DrawData(child);
                else
                    DrawGUIData(child);
            }
        }
    }

    void DrawGUIData(Data data) {
        GUIStyle style = "Label";
        Rect rt = GUILayoutUtility.GetRect(data.content, style);
        if (data.isSelected) {
            EditorGUI.DrawRect(rt, Color.gray);
        }

        rt.x += ( * EditorGUI.indentLevel);
        if (GUI.Button(rt, data.content, style)) {
            if (selectData != null) {
                selectData.isSelected = false;
            }
            data.isSelected = true;
            selectData = data;
            Debug.Log(data.assetPath);
        }
    }

    GUIContent GetGUIContent(string path) {
        Object asset = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
        if (asset) {
            return new GUIContent(asset.name, AssetDatabase.GetCachedIcon(path));
        }
        return null;
    }

    class Data {
        public bool isSelected = false;
        ;
        public GUIContent content;
        public string assetPath;
        public List<Data> childs = new List<Data>();
    }
}

6

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

public class MyEditor {

    [InitializeOnLoadMethod]
    static void Start() {
        Action OnEvent = delegate {
            Event e = Event.current;

            switch (e.type) {
                //            case EventType.mouseDown:
                //                Debug.Log ("mousedown");
                //                e.Use ();
                //                break;
                //            case EventType.mouseUp:
                //                Debug.Log ("mouseup");
                //                e.Use ();
                //                break;
                //            case EventType.MouseMove:
                //                Debug.Log ("move");
                //                e.Use ();
                //                break;
                case EventType.DragPerform:
                    Debug.Log("DragPerform");
                    e.Use();
                    break;
                case EventType.DragUpdated:
                    Debug.Log("DragUpdated");
                    e.Use();
                    break;
                case EventType.DragExited:
                    Debug.Log("DragExited");
                    e.Use();
                    break;
            }
        };

        EditorApplication.hierarchyWindowItemOnGUI = delegate (int instanceID, Rect selectionRect) {

            OnEvent();

        };

        EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect) {

            OnEvent();
        };

    }
}

7

using UnityEngine;
using UnityEditor;
using System.Collections;

public class MyHierarchyMenu {
    [MenuItem("Window/Test/yusong")]
    static void Test() {
    }

    [MenuItem("Window/Test/momo")]
    static void Test1() {
    }
    [MenuItem("Window/Test/雨松/MOMO")]
    static void Test2() {
    }

    [InitializeOnLoadMethod]
    static void StartInitializeOnLoadMethod() {
        EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
    }

    static void OnHierarchyGUI(int instanceID, Rect selectionRect) {
        if (Event.current != null && selectionRect.Contains(Event.current.mousePosition)
            && Event.current.button ==  && Event.current.type <= EventType.MouseUp) {
            GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
            //这里可以判断selectedGameObject的条件
            if (selectedGameObject.name == "SceneRoot") {
                Vector2 mousePosition = Event.current.mousePosition;

                EditorUtility.DisplayPopupMenu(, ), "Window/Test", null);
                Event.current.Use();
            }
        }
    }

}

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Reflection;
using UnityEngine.Profiling;

public class MyHierarchyMenu {
    [MenuItem("1/1")]
    public static void menu() {
        Texture target = Selection.activeObject as Texture;
        var type = System.Reflection.Assembly.Load("UnityEditor.dll").GetType("UnityEditor.TextureUtil");

        //var type = Types.GetType("UnityEditor.TextureUtil", "UnityEditor.dll");
        MethodInfo methodInfo = type.GetMethod("GetStorageMemorySize", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public);

        Debug.Log("内存占用:" + EditorUtility.FormatBytes(Profiler.GetRuntimeMemorySizeLong(Selection.activeObject)));
        Debug.Log("硬盘占用:" + EditorUtility.FormatBytes((int)methodInfo.Invoke(null, new object[] { target })));
    }

}

Unity编辑器扩展学习 转载的更多相关文章

  1. unity编辑器扩展学习

    扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...

  2. Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

    Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject  Unity编辑器扩展 Chapt ...

  3. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  4. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  5. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  6. Unity编辑器扩展Texture显示选择框

    学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...

  7. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  8. Unity3d编辑器扩展学习笔记

    编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...

  9. Unity编辑器扩展

    在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...

随机推荐

  1. 图片(jpg,png,tif等)批量转dicom(dcm)格式

    简介 医学领域专用工具,千金难求,可以批量把jpg.png.bmp.tif图片转换为dicom(dcm)格式,并且保持原有顺序,同时支持嵌入部分重要的dicom元数据,比如:病人姓名,病人生日等. 将 ...

  2. 用OC基于链表实现链队列

    一.简言 在前面已经用C++介绍过链队列的基本算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11692065.html.少说多做,还是上手撸代码实践一下 ...

  3. IT兄弟连 Java语法教程 数据类型2

    整型 Java定义了4种整数类型:byte.short.int和long.所有这些类型都是有符号的.正或负的整数.Java不支持无符号的.只是正值的整数.许多其它计算机语言同时支持有符号和无符号整数. ...

  4. 16-DRF工程搭建与序列化器

    1.DRF工程搭建 环境安装与配置 DRF是以Django扩展应用的方式提供的,所以我们可以直接利用Django环境,而无需创建(先创建Django环境). 1.安装DRF pip3 install ...

  5. 搭建Jupyter学习环境

    `python notebook`是一个基于浏览器的python数据分析工具,使用起来非常方便,具有极强的交互方式和富文本的展示效果.jupyter是它的升级版,它的安装也非常方便,一般`Anacon ...

  6. 对Python中函数参数类型及排序问题,三个方面的总结

    Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...

  7. 全栈工程师对Python面试中is和==区别的详细解说!看完真的学到了!

    面试实习生的时候,当问到 is 和 == 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致.本文我们来看一下这两者的区别. 我们先来看几个例子: a = "hel ...

  8. String字符串是不变对象,内容一旦创建不可改变,若改变一定会创建新对象

    package seday01;/** * 字符串是不变对象,内容一旦创建不可改变,若改变一定会创建新对象* @author xingsir */public class StringDemo { p ...

  9. linux安装IB驱动方法

    一.准备 1.Linux操作系统7.6(根据实际情况变更,此处用redhat7.6系统举例) 2.驱动:MLNX_OFED_LINUX-4.6-1.0.1.1-rhel7.6-x86_64.tgz(根 ...

  10. JMeter处理form-data类型的接口

    最近的需求中,有的接口入参是form-data类型的,除了用python多进程代码进行压测,考虑用Jmeter试试看,比对一下结果. 线程数设置的是50,循环次数为100,一共发送5000次请求. H ...