loading...马上就出来rua!

编辑器简单拓展


编辑器简单拓展

!!!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为在列表中显示顺序 脚本名不用与类名相同

检视器高级编程(外挂式编程)

在脚本外挂脚本从而修改脚本

  1. 在项目中建立Editor目录
  2. 在目录中建立脚本控制脚本
  3. 将两个脚本关联
    1. 引入UnityEditor命名空间
    2. 让Editor脚本继承Editor类
    3. [CustomEditor(typeof("控制的类名"))] 建立关联关系
    4. 创建成员变量 在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(){
        
    }
}

文章作者: mashimaro kumo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 mashimaro kumo !
评论
  目录