【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】

简介: 【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】

1.枚举菜单实现


文件1:Assets/MyScript/Test1.cs


代码如下:

uusing System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1 : MonoBehaviour
{
    public Enum4 mEnum;
    public int mInt;
    public float mFloat;
    public string mStr;
    public Color mColor;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

public enum Enum4
{
    None,
    IntVal,
    FloatVal,
    StrVal,
    ColorVal
}

文件2:Assets/MyScript/Editor/Test1Editor.cs


代码如下:

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

[CustomEditor(typeof(Test1),true)]
public class Test4Editor : Editor
{
    public SerializedObject mObj;
    public SerializedProperty mEnum;
    public SerializedProperty mInt;
    public SerializedProperty mFloat;
    public SerializedProperty mStr;
    public SerializedProperty mColor;
    public void OnEnable()
    {
        this.mObj = new SerializedObject(target);
        this.mEnum = this.mObj.FindProperty("mEnum");
        this.mInt = this.mObj.FindProperty("mInt");
        this.mFloat = this.mObj.FindProperty("mFloat");
        this.mStr = this.mObj.FindProperty("mStr");
        this.mColor = this.mObj.FindProperty("mColor");
    }
    public override void OnInspectorGUI()
    {
        this.mObj.Update();
        EditorGUILayout.PropertyField(this.mEnum);
        switch (this.mEnum.enumValueIndex)
        {
            case 1:
                EditorGUILayout.PropertyField(this.mInt);
                break;
            case 2:
                EditorGUILayout.PropertyField(this.mFloat);
                break;
            case 3:
                EditorGUILayout.PropertyField(this.mStr);
                break;
            case 4:
                EditorGUILayout.PropertyField(this.mColor);
                break;
        }
        this.mObj.ApplyModifiedProperties();
    }
}

测试一下


新建一个场景,新建一个Empty 节点,用来测试枚举组件

将文件1:Assets/MyScript/Test1.cs拖到Game Object的Inspector面板上。

实现了一个简单的枚举菜单:


2.Window窗口菜单实现


窗口菜单实现1——显示窗口:


文件:Assets/MyScript/Test2Window.cs


代码如下:

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

public class Test2Window : EditorWindow
{
    [MenuItem("测试2/ShowWindow")]
    public static void ShowWindow()
    {
        Test2Window.CreateInstance<Test2Window>().Show();
    }
}

测试一下


保存文件后,在窗口左边有"测试2/ShowWindow"菜单选项


如下:

打开"测试2/ShowWindow"窗口,如下:

窗口菜单实现2——弹出类型:


文件:Assets/MyScript/Test3Window.cs


代码如下:

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

public class Test3Window : EditorWindow
{
    [MenuItem("测试2/Test3Window")]
    public static void ShowWindow()
    {
        Test3Window.CreateInstance<Test3Window>().ShowUtility();
    }
}

测试一下


打开"测试2/Test3Window"窗口,如下:

窗口菜单实现3——浮动工具窗口:


文件:Assets/MyScript/Test4Window.cs


代码如下:

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

public class Test4Window : EditorWindow
{
    [MenuItem("测试2/Test4Window")]
    public static void ShowWindow()
    {
        Test4Window.CreateInstance<Test4Window>().ShowPopup();
    }

    public void OnGUI()
    {
        if(GUILayout.Button("关闭"))
        {
            this.Close();
        }
    }
}

测试一下


打开"测试2/Test4Window"窗口,如下:


3.Window窗口文本与颜色


文件:Assets/MyScript/Test6Window.cs


代码如下:

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

public class Test6Window : EditorWindow
{
    [MenuItem("测试2/Test6Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test6Window>().Show();
    }
    public string mText = "默认文本";
    public Color mColor = Color.white;
    public void OnGUI()
    {
        if (GUILayout.Button("关闭"))
        {
            this.Close();
        }
        this.mText = EditorGUILayout.TextField(this.mText);
        this.mText = EditorGUILayout.TextArea(this.mText);
        this.mText = EditorGUILayout.PasswordField(this.mText);

        this.mColor = EditorGUILayout.ColorField(this.mColor);
//EditorGUILayout 后面的关键字:TextField、TextArea、PasswordField和ColorField。

    }
}

测试一下


打开"测试2/Test6Window"窗口,如下:

窗口文本与颜色关键字:TextField、TextArea、PasswordField和ColorField。


4.Window窗口标签字段


文件:Assets/MyScript/Test7Window.cs


代码如下:

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

public class Test7Window : EditorWindow
{
    [MenuItem("测试2/Test7Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test7Window>().Show();
    }
    public string mText = "默认文本";
    public Color mColor = Color.white;
    public void OnGUI()
    {
        EditorGUILayout.LabelField("文本输入框");
        this.mText = EditorGUILayout.TextField(this.mText);
        EditorGUILayout.Space(20);
        this.mText = EditorGUILayout.TextArea(this.mText);
        EditorGUILayout.SelectableLabel("密码输入框");
        this.mText = EditorGUILayout.PasswordField(this.mText);

        this.mColor = EditorGUILayout.ColorField(this.mColor);
    }
}

测试一下


打开"测试2/Test7Window"窗口,如下:

窗口标签字段关键字:LabelField(“文本输入框”);和Space(20);


5.Window窗口滑动条


文件:Assets/MyScript/Test8Window.cs


代码如下:

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

public class Test8Window : EditorWindow
{
    [MenuItem("测试2/Test8Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test8Window>().Show();
    }
    public int mInt;
    public float mFloat;

    public float mMinFloat;
    public float mMaxFloat;
    public void OnGUI()
    {
        EditorGUILayout.LabelField("浮点值滑动条0-100");
        this.mFloat = EditorGUILayout.Slider(this.mFloat, 0, 100);
        EditorGUILayout.Space(20);
        EditorGUILayout.LabelField("整数值滑动条0-100");
        this.mInt = EditorGUILayout.IntSlider(this.mInt, 0, 100);

        EditorGUILayout.Space(30);
        EditorGUILayout.LabelField("最小值和最大值滑动条");
        this.mMinFloat = EditorGUILayout.Slider(this.mMinFloat, 0, 100);
        this.mMaxFloat = EditorGUILayout.Slider(this.mMaxFloat, 0, 100);
        EditorGUILayout.MinMaxSlider(ref this.mMinFloat, ref this.mMaxFloat, 0, 100);
    }
}

测试一下


打开"测试2/Test8Window"窗口,如下:

窗口标签字段关键字:Slider、IntSlider和EditorGUILayout.MinMaxSlider(ref this.mMinFloat, ref this.mMaxFloat, 0, 100);


6.Window三维四维数组


文件:Assets/MyScript/Test9Window.cs


代码如下:

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

public class Test9Window : EditorWindow
{
    [MenuItem("测试2/Test9Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test9Window>().Show();
    }
    public Vector2 mPos2;
    public Vector3 mPos3;
    public Vector4 mPos4;
    public Rect mRect;
    public Bounds mBounds;


    public void OnGUI()
    {
        this.mPos2 = EditorGUILayout.Vector2Field("二维数值",this.mPos2);
        this.mPos3 = EditorGUILayout.Vector3Field("三维数值",this.mPos3);
        this.mPos4 = EditorGUILayout.Vector4Field("四维数值",this.mPos4);
        EditorGUILayout.Space(20);
        EditorGUILayout.LabelField("矩阵");
        this.mRect = EditorGUILayout.RectField(this.mRect);
        EditorGUILayout.Space(20);
        EditorGUILayout.LabelField("间距");
        this.mBounds = EditorGUILayout.BoundsField(this.mBounds);
    }
}

测试一下


打开"测试2/Test9Window"窗口,如下:

窗口标签字段关键字:Vector4Field、RectField和BoundsField


7.Window标签/层和对象选择


文件:Assets/MyScript/Test10Window.cs


代码如下:

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

public class Test10Window : EditorWindow
{
    [MenuItem("测试2/Test10Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test10Window>().Show();
    }
    public string mStr;
    public int mInt;
    public Object mObj1;
    public Object mObj2;
    public Object mObj3;
    public Object mObj4;

    public void OnGUI()
    {
        EditorGUILayout.LabelField("Tag");
        this.mStr = EditorGUILayout.TagField(this.mStr);
        EditorGUILayout.Space(170);
        EditorGUILayout.LabelField("Layer");
        this.mInt = EditorGUILayout.LayerField(this.mInt);
        EditorGUILayout.Space(150);
        EditorGUILayout.LabelField("Camera");
        this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera));
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Transform");
        this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform));
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Texture");
        this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture));
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Object_场景和资源的都可选");
        this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object));
    }
}

测试一下


打开"测试2/Test10Window"窗口,如下:


8.Window实现Bool和折叠框


文件:Assets/MyScript/Test11Window.cs


代码如下:

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

public class Test11Window : EditorWindow
{
    [MenuItem("测试2/Test11Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test11Window>().Show();
    }
    public bool mBool1;
    public bool mBool2;
    public string mStr;
    public int mInt;
    public Object mObj1;
    public Object mObj2;
    public Object mObj3;
    public Object mObj4;

    public void OnGUI()
    {
        this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1);
        if (this.mBool1)
        {
            EditorGUILayout.LabelField("Tag");
            this.mStr = EditorGUILayout.TagField(this.mStr);
            EditorGUILayout.Space(20);
            EditorGUILayout.LabelField("Layer");
            this.mInt = EditorGUILayout.LayerField(this.mInt);
            EditorGUILayout.Space(20);
            EditorGUILayout.LabelField("Camera");
            this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera));
        }

        this.mBool2 = EditorGUILayout.Foldout(this.mBool2 , "是否折叠");
        if (this.mBool2)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Transform");
            this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Texture");
            this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Object_场景和资源的都可选");
            this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object));
        }
    }
}

测试一下


打开"测试2/Test11Window"窗口,如下:

Bool和折叠框实现结构:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Test11Window : EditorWindow
{
    [MenuItem("测试2/Test11Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test11Window>().Show();
    }
    public bool mBool1;
    public bool mBool2;
...
    public void OnGUI()
    {
        this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1);
        if (this.mBool1)
        {
...
        }

        this.mBool2 = EditorGUILayout.Foldout(this.mBool2 , "是否折叠");
        if (this.mBool2)
        {
...
        }
    }
}


9.Window实现滑动条和禁用置灰选项


文件:Assets/MyScript/Test12Window.cs


代码如下:

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

public class Test12Window : EditorWindow
{
    [MenuItem("测试2/Test12Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test12Window>().Show();
    }
    public bool mBool1;
    public bool mBool2;
    public bool mBool3;

    public string mStr;
    public int mInt;
    public Object mObj1;
    public Object mObj2;
    public Object mObj3;
    public Object mObj4;

public Vector2 mPos;
    public void OnGUI()
    {
        this.mPos = EditorGUILayout.BeginScrollView(this.mPos);
        this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1);
        if (this.mBool1)
        {
            EditorGUILayout.LabelField("Tag");
            this.mStr = EditorGUILayout.TagField(this.mStr);
            EditorGUILayout.Space(20);
            EditorGUILayout.LabelField("Layer");
            this.mInt = EditorGUILayout.LayerField(this.mInt);
            EditorGUILayout.Space(20);
            EditorGUILayout.LabelField("Camera");
            this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera));
        }

        this.mBool2 = EditorGUILayout.Foldout(this.mBool2, "是否折叠");
        if (this.mBool2)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Transform");
            this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Texture");
            this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Object_场景和资源的都可选");
            this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object));
        }

        this.mBool3 = EditorGUILayout.BeginToggleGroup("是否禁用置灰", this.mBool3);
        EditorGUILayout.LabelField("Tag");
        this.mStr = EditorGUILayout.TagField(this.mStr);
        EditorGUILayout.LabelField("Layer");
        this.mInt = EditorGUILayout.LayerField(this.mInt);
        EditorGUILayout.LabelField("Camera");
        this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera));
        EditorGUILayout.EndToggleGroup();
        EditorGUILayout.EndScrollView();
    }
}

测试一下


打开"测试2/Test12Window"窗口,如下:

窗口右侧滑动条实现结构
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Test12Window : EditorWindow
{
    [MenuItem("测试2/Test12Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<Test12Window>().Show();
    }
    public Object mObj4;

public Vector2 mPos;
    public void OnGUI()
    {
        this.mPos = EditorGUILayout.BeginScrollView(this.mPos);//窗口右侧滑动条开始
...//中间包含的菜单
        EditorGUILayout.EndScrollView();//窗口右侧滑动条结束

    }
}

是否禁用置灰实现结构
        this.mBool3 = EditorGUILayout.BeginToggleGroup("是否禁用置灰", this.mBool3);
        ...
        EditorGUILayout.EndToggleGroup();
        ...
相关文章
|
21天前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
19 1
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
51 1
|
6天前
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
13 0
|
Java C# 开发工具
开发语言漫谈-C#
C#的#,字面上的意思就是++++
|
15天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
28 1
|
3月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
74 2
|
3月前
|
存储 C#
C#入门开发(Hello World,运算符)
C#入门开发(Hello World,运算符)
28 0
|
4月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
41 0
|
4月前
|
JSON C# 图形学
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
51 0