编辑器检视器面板深度扩展2+编辑器菜单栏扩展

编辑器检视器面板深度扩展2

接前文检视器高级修改(外挂式编程)

Player相关属性如下所示:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//单选我们使用十进制理解,即不同数代表不同选项
public enum PlayerProfession
{
    Warrior=0,
    Wizard=1
}
//多选使用二进制理解,即不同位代表不同选项
public enum PlayerLoveColor
{
    Green=1,
    Red=2,
    Pink=4,
}
//将Player(指定脚本的名字)组件添加到AddComponent上
//第一个参数:分类名/组件名
//第二个参数:列表中显示的顺序
[AddComponentMenu("自定义控制器/玩家控制器",1)]
//使生命周期函数,在编辑器状态下可以执行,游戏中也可以正常使用
[ExecuteInEditMode]
//关于类型和类名
//BoxCollider:是类名,适用于函数提供泛型方法 
//typeof(BoxCollider):System.Type,C#的类型,适用于函数需要System.Type参数

//当前组件依赖于盒子碰撞体
//当前组件挂载在对象上时,盒子碰撞体会一起被添加上去
//当Player(当前脚本的名字)组件没有被移除时,盒子碰撞体不能被删除
[RequireComponent(typeof(BoxCollider))]
public class Player : MonoBehaviour
{
    public int ID;
    public string Name;
    public float Atk;
    public bool isMan;
    public Vector3 HeadDir;
    public Color Hair;
    public GameObject Weapon;
    public Texture Cloth;
    public Profession pro1;
    public PlayerLoveColor play1;
    public List<string> Items;
    void Update()
    {
        Debug.Log("Update");
    }
}

扩展内容代码如下:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//步骤1:引入编辑器的命名空间,检视器属于编辑器开发
using UnityEditor;

[CustomEditor(typeof(Player))]//步骤3:将编辑器开发脚本与需要编辑的组件脚本建立外挂关联关系
//外挂脚本因为存储在Editor目录下,所以不会被打入最终的游戏包
//不继承自Mono,而是继承自Editor
public class PlayerEditor : Editor  //步骤2:继承Editor类,使用编辑器相关的成员变量和生命周期函数
{
    //获得到需要编辑显示的组件
    private Player _Component;
    //步骤4:需要在当前的外挂脚本中,获得需要被扩展的Player组件对象
    //当关联组件所在对象被选中或组件被添加时,调用
    private void OnEnable()
    {
        Debug.Log("enable");
        //步骤5:获取Player组件对象
        _Component = target as Player;
    }
    //当关联组件所在对象被取消或组件被移除时,调用
    private void OnDisable()
    {
        Debug.Log("disable");
        _Component = null;
    }
    public override void OnInspectorGUI()
    {
        //标题显示
        EditorGUILayout.LabelField("人物相关属性");
        _Component.ID=EditorGUILayout.IntField("玩家ID",_Component.ID);
        _Component.Name = EditorGUILayout.TextField("玩家名称", _Component.Name);
        _Component.Atk = EditorGUILayout.FloatField("玩家攻击力", _Component.Atk);
        _Component.isMan = EditorGUILayout.Toggle("是否为男性", _Component.isMan);
        _Component.HeadDir = EditorGUILayout.Vector3Field("头部方向", _Component.HeadDir);
        _Component.Hair = EditorGUILayout.ColorField("头发颜色", _Component.Hair);
        ///对象数据类型绘制///
        //参数1:标题
        //参数2:原始组件的值
        //参数3:成员变量的类型
        //参数4:是否可以将场景中的对象拖给这个成员变量
        _Component.Weapon = EditorGUILayout.ObjectField("持有武器", _Component.Weapon, typeof(GameObject), true) as GameObject;
        //纹理
        _Component.Cloth=EditorGUILayout.ObjectField("衣服材质贴图",_Component.Cloth,typeof(Texture),false)as Texture;
        //单选枚举(标题,组件上的原始值)
        _Component.pro1 = (Profession)EditorGUILayout.EnumPopup("玩家职业", _Component.pro1);
        //多选枚举(标题,组件上的原始值)
        _Component.play1 = (PlayerLoveColor)EditorGUILayout.EnumFlagsField("玩家喜欢的颜色", _Component.play1);

        //终极数据类型绘制
        //更新可序列化数据
        serializedObject.Update();
        //通过成员变量名找到组件上的成员变量
        SerializedProperty sp = serializedObject.FindProperty("Items");
        //可序列化数据绘制(取到的数据,标题,是否将所有获得的序列化数据显示出来)
        EditorGUILayout.PropertyField(sp, new GUIContent("道具信息"),true);
        //将修改的数据,写入到可序列化的原始数据中
        serializedObject.ApplyModifiedProperties();
    }
}

检视器面板相应情况如图:

滑动条绘制:

cs 复制代码
//滑动条显示(1.标题,2.原始变量,最小值,最大值)
_Component.Atk=EditorGUILayout.Slider(new GUIContent("玩家攻击力"),_Component.Atk,0,100);
if(_Component.Atk>80)
{
    //显示消息框(红色)
    EditorGUILayout.HelpBox("攻击力太高了",MessageType.Error);
}
if(_Component.Atk<20)
{
    //显示消息框(黄色)
    EditorGUILayout.HelpBox("攻击力太低了",MessageType.Warning);
}

按钮显示和元素排列

cs 复制代码
        GUILayout.Button("来个按钮");
        GUILayout.Button("来个按钮");
        //根据按钮返回值,判定按钮是否被按下
        if (GUILayout.Button("测试点击"))
        {
            Debug.Log("测试点击");
        }
        //开始横向排列绘制
        EditorGUILayout.BeginHorizontal();
        GUILayout.Button("再来个按钮");
        GUILayout.Button("再来个按钮");
        GUILayout.EndHorizontal();
        if (GUILayout.Button("检查"))
        {
            Debug.Log("检查");
        }
        if (GUILayout.Button("排查"))
        {
            Debug.Log("排查");
        }
编辑器菜单栏扩展
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class Menu
{
    [MenuItem("工具/导出AB资源包")]
    static void BuildAB()
    {
        Debug.Log("导出AB资源包");
        Debug.Log(Application.persistentDataPath);
    }
}

实现效果:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class PopWindow : EditorWindow
{
    [MenuItem("工具/创建窗口")]
    static void OpenWindow()
    {
        PopWindow window=GetWindow<PopWindow>(false,"弹窗标题",true);
        window.minSize = new Vector2(400, 300);
        window.minSize = new Vector2(800, 600);
    }
    private void OnEnable()
    {

    }
    private void OnDisable()
    {

    }
    private void Update()
    {

    }
    private void OnGUI()
    {
        if (GUILayout.Button("测试点击"))
        {
            Debug.Log("测试点击");
        }
    }
}

实现效果:

该系列专栏为网课课程笔记,仅用于学习参考。

相关推荐
环黄金线HHJX.9 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器
环黄金线HHJX.12 小时前
龙虾钳足启发的AI集群语言交互新范式
开发语言·人工智能·算法·编辑器·交互
Irene19911 天前
Cursor/VSCode 连接 WSL 频繁掉线问题完整排查记录(AI总结版)
编辑器·wsl
cmpxr_1 天前
【VSCode】在类似Trae的软件上使用VSCode的插件市场
ide·vscode·编辑器
吴声子夜歌1 天前
Node.js——crypto加密模块
node.js·编辑器·vim
cui_ruicheng1 天前
Linux基础开发工具(三):Git 版本控制与 GDB 调试入门
linux·git·编辑器
环黄金线HHJX.1 天前
【吧里BaLi社区】
开发语言·人工智能·qt·编辑器
Irene19912 天前
排查 VS Code 插件:多个补全功能同时启用导致的冲突(69个插件确实太多了,全部删除重新安装彻底解决冲突问题)
编辑器·插件冲突
咬人喵喵2 天前
E2.COOL 平台深度解析:从特效分类到实战操作指南
前端·编辑器·svg
环黄金线HHJX.2 天前
《Tuan(拼音字母)⇆团(Group)/&湍(Turbulence)/&双结构链路道/&文字、符号、语言/&源点设计、连接起:人类与自然+AICosmOS》
开发语言·人工智能·算法·编辑器