unity Inspector 面板扩展

通常情况下,我们定义了一个脚本1,公开了一些变量
脚本1:

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

public class Player : MonoBehaviour
{
    public int id;

    public string playerName;
    public string backStory;
    public float health;
    public float damage;

    public float weaponDamage1, weaponDamage2;

    public string shoeName;
    public int shoeSize;
    public string shoeType;

    void Start()
    {
        health = 50;
    }
}

然后在unity中挂了该脚本的物体的Inspector面板就是这样的
在这里插入图片描述
每一个变量都会有对应的输入框,这种机制相当人性化,为开发者提供了一定的便利,点赞!

不过有的开发者想用更多样化的形式把变量展示出来,让Inspector界面内容更加丰富一些。
例如添加一些滑条、进度条、文本显示框、标题、警告、提示、…等一系列的UI元素并把数值与我们原有的变量关联起来,比如这样的

这些元素的编辑我们可以在OnInspectorGUI的重写方法中完成
下边的脚本展示了上方界面的拓展过程:

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

//CustomEditor(typeof()) 用于关联你要自定义的脚本
[CustomEditor(typeof(Player))]
//必须要让该类继承自Editor,且不需要导入UnityEditor程序集
public class PlayerInspector : Editor
{
    Player player;
    bool showWeapons;

    private void OnEnable()
    {//获取当前编辑自定义Inspector的对象
        player = (Player)target;
    }
    //执行这一个函数来自定义检视面板
    public override void OnInspectorGUI()
    {
        //设置整个界面是以垂直方向来布局
        EditorGUILayout.BeginVertical();

        //空两行
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //绘制palyer的基本信息
        EditorGUILayout.LabelField("基本信息");
        //变量重写映射
        player.id = EditorGUILayout.IntField("编号", player.id);
        //自定义文本输入框
        player.playerName = EditorGUILayout.TextField("名字", player.playerName);

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //绘制Player的背景故事
        EditorGUILayout.LabelField("背景故事");
        //自定义文本输入区域
        player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight(100));

        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //自定义滑条(变量命名,变量取值范围)
        player.health = EditorGUILayout.Slider("生命值", player.health, 0, 100);
        //判断滑条数值
        if (player.health < 20)
        {
            //指定下方ui颜色
            GUI.color = Color.red;
        }
        else if (player.health < 80)
        {
            GUI.color = Color.green;
        }
        else
        {
            GUI.color = Color.gray;
        }

        //自定义进度条区域
        Rect progressRect = GUILayoutUtility.GetRect(200, 50);
        //定义进度条(区域,进度值,进度条中的文本)
        EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "生命值");

        //定义下方面板ui颜色
        GUI.color = Color.white;

        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //定义滑条
        player.damage = EditorGUILayout.Slider("Damage", player.damage, 0, 20);
        //判断数值
        if (player.damage < 10)
        {
            //自定义帮助框(内容,类型:错误、警告、信息)
            EditorGUILayout.HelpBox("伤害太低了吧!", MessageType.Error);
        }
        else if (player.damage < 15)
        {
            EditorGUILayout.HelpBox("伤害有点高啊!", MessageType.Warning);
        }
        else
        {
            EditorGUILayout.HelpBox("伤害适中", MessageType.Info);
        }

        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //自定义一个可折叠标签(是否展开,命名)
        showWeapons = EditorGUILayout.Foldout(showWeapons, "武器");
        if (showWeapons)//如果展开
        {
            //自定义标签选项并映射给player中的变量(命名,数值)
            player.weaponDamage1 = EditorGUILayout.FloatField("武器一伤害", player.weaponDamage1);
            player.weaponDamage2 = EditorGUILayout.FloatField("武器二伤害", player.weaponDamage2);
        }

        //空三行
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        EditorGUILayout.Space();

        //自定义文本
        EditorGUILayout.LabelField("鞋子");

        //UI排列方向为横向
        EditorGUILayout.BeginHorizontal();
        //自定义下方变量(名称,ui宽度)
        EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(50));
        //文本输入框映射
        player.shoeName = EditorGUILayout.TextField(player.shoeName);
        EditorGUILayout.LabelField("Size", GUILayout.MaxWidth(50));
        player.shoeSize = EditorGUILayout.IntField(player.shoeSize);
        EditorGUILayout.LabelField("Type", GUILayout.MaxWidth(50));
        player.shoeType = EditorGUILayout.TextField(player.shoeType);
        //横向编辑结束
        EditorGUILayout.EndHorizontal();
        //纵向编辑结束
        EditorGUILayout.EndVertical();
    }
}

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值