zoukankan      html  css  js  c++  java
  • Unity---Inspector面板自定义

    一. 参数自定义

    一个含有成员的类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在编辑状态下运行

  • 相关阅读:
    垂直水平居中几种实现风格
    重绘(repaint)和回流(reflow)
    对象深拷贝
    PhantomJS not found on PATH
    d3.js 数据操作
    canvas 绘制圆弧
    d3.js 柱状图
    d3.js -- 比例尺 scales scaleLinear scaleBand scaleOrdinal scaleTime scaleQuantize
    d3.js -- select、selectAll
    map映射
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/10420626.html
Copyright © 2011-2022 走看看