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