【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();
        ...
相关文章
|
9天前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
开发者 图形学 开发工具
Unity编辑器神级扩展攻略:从批量操作到定制Inspector界面,手把手教你编写高效开发工具,解锁编辑器隐藏潜能
【8月更文挑战第31天】Unity是一款强大的游戏开发引擎,支持多平台发布与高度可定制的编辑器环境。通过自定义编辑器工具,开发者能显著提升工作效率。本文介绍如何使用C#脚本扩展Unity编辑器功能,包括批量调整游戏对象位置、创建自定义Inspector界面及项目统计窗口等实用工具,并提供具体示例代码。理解并应用这些技巧,可大幅优化开发流程,提高生产力。
126 1
|
2月前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
44 1
|
1月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
48 0
|
1月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
108 0
|
2月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
40 0
|
2月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
68 0
|
2月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
76 0
|
2月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
56 0
|
2月前
|
开发者 Apache 程序员
揭秘Apache Wicket:页面生命周期背后的神秘力量!
【8月更文挑战第31天】李工是一位热爱Web开发的程序员,近日在技术博客上分享了他对Apache Wicket框架的学习心得,特别是页面生命周期的理解。他认为掌握Wicket页面生命周期对于开发富交互式Web应用至关重要。他通过一个简单的计数器应用示例,详细解释了Wicket的组件化设计理念以及页面和组件在生命周期中的变化。
30 0