Editor 代码整理Hierarchy面板,实用技能Get

这是按字母升序排列
[C#]  纯文本查看  复制代码
public class AscendingSort : BaseHierarchySort {
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return EditorUtility .NaturalCompare( lhs.name , rhs.name);
    }
}




按字母降序排列
[C#]  纯文本查看  复制代码
public class DescendingSort : BaseHierarchySort {
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return 1; }
        if (rhs == null) { return -1; }
        return EditorUtility .NaturalCompare( rhs.name , lhs.name);
    }
}


按InstanceID排序
[C#]  纯文本查看  复制代码
public class InstanceIDSort : BaseHierarchySort {
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return lhs .GetInstanceID(). CompareTo(rhs .GetInstanceID());
    }
}



按HashCode排序
[C#]  纯文本查看  复制代码
public class HashCodeSort : BaseHierarchySort {
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return lhs .GetHashCode(). CompareTo(rhs .GetHashCode());
    }
}



InstanceID排序与HashCode排序是一样的,没有看出其中的差异。

当然除了排序,我们还可以干点其他的,比如把排序下拉框改成中文的,一样很简单,如下
如果想要你的下拉选项变成中文的,没关系一样可以搞定(以升序排列为例),如下
[C#]  纯文本查看  复制代码
public class 升序排列: BaseHierarchySort {
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return EditorUtility .NaturalCompare( lhs.name , rhs.name);
    }
}


别担心,的类名是可以使用中文名的,你就大胆的使用吧。

如果你不满足于只是下拉选择框是中文的,还希望上面的图标也变成中文,没关系,一样可以搞定,只需复写一下content就可以了
[C#]  纯文本查看  复制代码
public class 升序排列 : BaseHierarchySort
{
    public override int Compare( GameObject lhs , GameObject rhs)
    {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return EditorUtility .NaturalCompare( lhs.name , rhs.name);
    }
    public override GUIContent content {
        get { return new GUIContent( "升序"); }
    }
}


显示图片也是没有问题的哦,给个图文混合显示的吧
[C#]  纯文本查看  复制代码
public class AscendingSort : BaseHierarchySort {
    private readonly GUIContent _content;

    public AscendingSort() {
        Texture2D image = Resources. Load<Texture2D >("Fire");
        if (image ) {
            _content = new GUIContent( "升序", image , "升序排列");
        }
        else {
            _content = new GUIContent( "升序", "升序排列" );
        }
    }

    public override GUIContent content {
        get { return _content; }
    }
    public override int Compare( GameObject lhs , GameObject rhs) {
        if (lhs == rhs) { return 0; }
        if (lhs == null) { return -1; }
        if (rhs == null) { return 1; }
        return EditorUtility .NaturalCompare( lhs.name , rhs.name);
    }
}



当然上面的也可以换成自定义的图片,自定义文字,自定义图片+文字,也可以给与美术进行提示等等。全部只看你返回的是一个什么样的content了,这里就不做更多的介绍了

项目工程下载地址 https://github.com/sevenfires/HierarchySort.git
<think>好的,我需要回答用户关于Unity检索面板修改时调用的函数的问题。首先,我要确定用户指的是哪个具体的面板Unity中有多种面板,比如Inspector、Project窗口、Hierarchy等,但通常“检索面板”可能指的是Project窗口中的搜索功能,或者Inspector中的属性修改。 用户提到“修改时调用的函数”,可能是指当在Inspector中修改某个属性时,Unity会触发哪些回调函数。常见的回调包括OnValidate(),它会在脚本加载或Inspector中的值更改时调用。需要确认这一点,并解释其用途和注意事项。 另外,如果是Project窗口中的搜索过滤修改,可能涉及Editor脚本中的OnSearchChanged事件,但这属于更高级的自定义编辑器功能。需要判断用户的需求层次,可能更关注常用的Inspector修改回调。 接下来,我需要组织回答的结构,先介绍OnValidate()函数,说明它在属性修改时的作用,然后提供示例代码,并提醒使用时的注意事项,比如避免耗时操作。如果用户需要更高级的检索面板修改,可以简要提及Editor脚本中的相关事件,但重点放在常用部分。 确保使用正确的中文术语,比如“Inspector窗口”翻译为“检视窗口”,“回调函数”等术语保持准确。同时,检查LaTeX格式是否符合要求,比如行内公式使用$...$,独立公式用$$...$$,但在这个问题中可能涉及代码较多,公式较少,需注意代码块的正确标记。 最后,验证信息的准确性,确保OnValidate()确实是Unity中用于处理属性修改的函数,并提供官方文档链接或建议,以增强可靠性。总结步骤,确保回答结构清晰,逐步引导用户理解相关函数及其用法。</think>在Unity中,当涉及到检索面板(如Inspector窗口)的属性修改时,主要通过以下两种机制实现回调: 1. **OnValidate() 函数** 这是Unity提供的特殊回调函数,当满足以下条件时自动触发: - 脚本加载时(包括进入Play模式或重新编译后) - **在Inspector中修改了任何序列化字段的值时** 典型用法示例: ```csharp using UnityEngine; public class Example : MonoBehaviour { [SerializeField] private int _health; // Inspector修改_health时会触发 private void OnValidate() { _health = Mathf.Clamp(_health, 0, 100); Debug.Log($"Health updated: {_health}"); } } ``` 2. **属性监听(Property Setter)** 可通过自定义setter实现实时响应: ```csharp [SerializeField] private float _speed; public float Speed { get => _speed; set { _speed = value; Debug.Log($"Speed changed to: {_speed}"); } } ``` --- **注意事项:** - `OnValidate()` 在编辑模式下运行,需用 `#if UNITY_EDITOR` 包裹仅限编辑器的代码 - 避免在此函数中执行耗时操作,可能影响编辑器流畅度 - 若需响应GameObject激活状态变化,可使用 `OnEnable()`/`OnDisable()` --- **高级扩展:自定义检索面板** 如需深度定制Inspector行为,可通过编写Editor脚本实现: ```csharp using UnityEditor; [CustomEditor(typeof(Example))] public class ExampleEditor : Editor { public override void OnInspectorGUI() { if (GUILayout.Button("Reset Values")) { ((Example)target).Reset(); } DrawDefaultInspector(); // 绘制默认界面 } } ``` 建议参考Unity官方文档: - [OnValidate()](https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnValidate.html) - [Custom Editors](https://docs.unity3d.com/Manual/editor-CustomEditors.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值