编辑器简单拓展
!!!UnityEditor不能被游戏内脚本引用 否则会导致打包失败
[HideInInspector] 隐藏公共成员变量 防止inspector的值影响它
[SerializeField] 使私有变量在检视面板可见[^1]
[Serializable] 使对象可序列化
[Range(a, b)] 使变量显示时显示a-b的滑动条范围
[Tooltip] 在编辑器显示时的悬浮提示文字
*一个成员变量可添加多个特性
[Header("分类")] 在上方显示小类名
[Space(50)] 隔开50像素距离
[Multiline(5)] 指定文字输入框为五行
[TextArea(5, 10)] 使文本框在最小范围(5)到最大范围(10)之间自动变换 如多于最大行则以滚动条形式显示
[ContextMenu("函数作用")] 使小齿轮处增加一个回调函数
[ContextMenuItem("悬浮显示提示", "回调函数名")] 给成员变量添加右键菜单回调函数
[RequireComponent(typeof(组件名)] 组件依赖 自动添加依赖的组件 且当改组件未被移除时依赖组件不允许删除
[ExecuteInEditMode] 使生命周期函数在编辑器状态下可以执行(不影响游戏中正常使用) *Update在场景中对象发生变化或项目组织发生变化时会执行
[^1]: Unity会将对象进行序列化存储, 故私有变量标记为可序列化对象后可显示.公有变量默认可序列化.
编辑器深度拓展
[addComponentMenu("目录名/脚本名", 1)] 将组建添加到AddComponent上, 目录名可省略 1为在列表中显示顺序 脚本名不用与类名相同
检视器高级编程(外挂式编程)
在脚本外挂脚本从而修改脚本
- 在项目中建立Editor目录
- 在目录中建立脚本控制脚本
- 将两个脚本关联
- 引入
UnityEditor命名空间 - 让Editor脚本继承Editor类
[CustomEditor(typeof("控制的类名"))]建立关联关系- 创建成员变量 在
OnEnable()函数中获得需要编辑显示组件
- 引入
private Player _Component;
//当关联组件所在对象被选中或组件被添加时调用
void OnEnable(){
_Component = target as Player;
}
//当关联组件所在对象被取消选中或组件被移除时调用
void OnDisable(){
_Component = null;
}
//用于绘制检视面板的生命周期函数(每帧绘制编辑器时被调用)
public override void OnInspectorGUI(){
//标题显示
EditorGUILayout.LabelField("标题名");
//赋值使在编辑器中对变量值的修改生效
_Component.ID = EditorGUILayout.IntField("显示名", _Component.ID);
//其他值类型同理 除布尔类型为EditorGUILayout.Toggle
//对象数据类型:显示名 值 类型 是否可以拖入赋值
_Component.Weapon = EditoeGUILayout.ObejectField("", _Component.Weapon, typeof("GameObject"), true) as GameObject;
//单选枚举
_Component.Pro = (枚举名)EditorGUILayout.EnumPopup("显示名", 值);
//多选枚举
_Component.Color = (枚举名)EditorGUILayout.EnumFlagsField("显示名", 值);
//终极数据类型绘制(支持任何数据类型)
//更新可序列化数据
serializedObject.Update();
//通过成员变量名找到组件上的成员变量
SerializedProperty sp = serializedObject.FindProperty("Items");
//可序列化数据绘制(取到的数据, 标题, 是否显示所有获得的序列化数据)
EditorGUILayout.PropertyField(sp, new GUIContent("道具信息"), true);
//将修改的数据写入可序列化的原始数据中
serializedObject.ApplyModifiedProperties();
//滑动条绘制(标题 值 最小值 最大值)
_Component.Atk = EditorGUILayout.Slider(new GUICoontent("玩家攻击力"), _Component.Atk, 0, 100);
if(_Component.Atk > 80){
//显示红消息框
EditorGUILayout.HelpBox("攻击力太高了", MessageType.Error);
}
if(_Component.Atk < 20){
//显示黄消息框
EditorGUILayout.HelpBox("攻击力太低了", MessageType.Warning);
}
//绘制按钮(默认纵向排列)
GUILayout.Button("按钮名");
//横向绘制
EditorGUILayout.BeginHorizontal();
if(GUILayout.Button("检查")){
Debug.Log("检查");
}
if(GUILayout.Button("排查")){
Debug.Log("排查");
}
EditorGUILayout.EndHorizontal();
}
弹窗
using UnityEditor;
public class PopWindow : EditorWindow{
//使顶部菜单出现方法
[MenuItem("工具/创建窗口")]
static void OpenWindow(){
//泛型内类型表示用哪个脚本创建窗口(是否为工具窗口 标题 是否打开立刻获得焦点)
GetWindow(false, "弹窗标题", true);
window.minSize = new Vector(400, 300);
window.maxSize = new Vector(800, 600);
}
//打开窗口时调用
private void OnEnable(){
}
//关闭窗口时调用
private void OnDisable(){
}
//窗口处于开启状态时调用
private void Update(){
}
private void OnGUI(){
//在此可用上面OnInspectorGUI中函数绘制界面
}
//当场景发生变化时执行
private void OnHierarchyChange(){
}
}