博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity---Inspector面板自定义
阅读量:6712 次
发布时间:2019-06-25

本文共 4435 字,大约阅读时间需要 14 分钟。

一. 参数自定义

一个含有成员的类Player

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;    }}

写完之后,inspector面板上是这样的:

然后,写一个编辑扩展脚本(写出该脚本即可,不需要做任何操作):

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;//CustomEditor(typeof()) 用于关联你要自定义的脚本[CustomEditor(typeof(Player))]//必须要让该类继承自Editor,且不需要导入UnityEditor程序集public class PlayerInspector : Editor{    Player player;    bool showWeapons;    void OnEnable()    {        //获取当前编辑自定义Inspector的对象        player = (Player)target;    }    //执行这一个函数来一个自定义检视面板    public override void OnInspectorGUI()    {        //设置整个界面是以垂直方向来布局        EditorGUILayout.BeginVertical();        //空两行        EditorGUILayout.Space();        EditorGUILayout.Space();        //绘制palyer的基本信息        EditorGUILayout.LabelField("Base Info");        player.id = EditorGUILayout.IntField("Player ID", player.id);        player.playerName = EditorGUILayout.TextField("PlayerName", player.playerName);        //空三行        EditorGUILayout.Space();        EditorGUILayout.Space();        EditorGUILayout.Space();        //绘制Player的背景故事        EditorGUILayout.LabelField("Back Story");        player.backStory = EditorGUILayout.TextArea(player.backStory, GUILayout.MinHeight(100));        //空三行        EditorGUILayout.Space();        EditorGUILayout.Space();        EditorGUILayout.Space();        //使用滑块绘制 Player 生命值        player.health = EditorGUILayout.Slider("Health", player.health, 0, 100);        //根据生命值设置生命条的背景颜色        if (player.health < 20)        {            GUI.color = Color.red;        }        else if (player.health > 80)        {            GUI.color = Color.green;        }        else        {            GUI.color = Color.gray;        }        //指定生命值的宽高        Rect progressRect = GUILayoutUtility.GetRect(50, 50);        //绘制生命条        EditorGUI.ProgressBar(progressRect, player.health / 100.0f, "Health");        //用此处理,以防上面的颜色变化会影响到下面的颜色变化        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, "Weapons");        if (showWeapons)        {            player.weaponDamage1 = EditorGUILayout.FloatField("Weapon 1 Damage", player.weaponDamage1);            player.weaponDamage2 = EditorGUILayout.FloatField("Weapon 2 Damage", player.weaponDamage2);        }        //空三行        EditorGUILayout.Space();        EditorGUILayout.Space();        EditorGUILayout.Space();        //绘制鞋子信息        EditorGUILayout.LabelField("Shoe");        //以水平方向绘制        EditorGUILayout.BeginHorizontal();        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();    }}

写完之后inspector面板上是这样的

 

通过自定义Inspector视图可以实现很多方便的功能。例如将脚本组件的static变量或者私有变量显示出来,或者实现多参数的联动变化,即修改其中的某个参数,其余参数会随之调整。

内容转载自https://www.jianshu.com/p/2f686da4905c

二. 编辑时运行

代码:

[ExecuteInEditMode]public class Test : MonoBehaviour{    // Update is called once per frame    void Update()    {        transform.LookAt(Vector3.zero);    }}

ExecuteInEditMode表示程序的Update在编辑状态下运行

转载于:https://www.cnblogs.com/xiaoahui/p/10420626.html

你可能感兴趣的文章
1137. Final Grading (25)
查看>>
算法与数据结构(十) 总结
查看>>
这部在豆瓣和IMDb都曾得到高分的电影,让我震撼......
查看>>
Json解析框架之Gson详解
查看>>
支持生产阻塞的线程池
查看>>
[Hadoop]Reducer总是能复用为Combiner?
查看>>
自动化与机器人
查看>>
ESP8266 OTA之浏览器更新
查看>>
专访光鉴科技CEO朱力:打破苹果垄断,自研芯片打造低成本3D视觉解决方案
查看>>
docker的下载
查看>>
redis几种数据导出导入方式
查看>>
中间件万里行?不远万里来相会?| 阿里中间件Aliware 开启全国赋能之旅
查看>>
对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
查看>>
多Git账户的Git使用
查看>>
iOS脚本自动编译静态包/静态库
查看>>
并发安全的 ConcurrentHashMap 实现原理详解
查看>>
【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)
查看>>
初识 Vue(26)---( Vue 中多个元素或组件的过渡动画)
查看>>
HyperLedger Fabric 1.2 区块链技术定义(2.1)
查看>>
Sam Hartman 当选 Debian 社区领导人
查看>>