Unity3D 编辑器对象锁定工具

在实际的 Unity 项目里,有很多对象是运行时自动生成的、由系统维护的或者依赖复杂逻辑的。如果能随便改它们,很容易导致数据错乱、功能失效,甚至场景崩掉。所以,Unity 提供了 HideFlags 这套机制来"保护现场"。

保护对象

cs 复制代码
HideFlags.NotEditable        // 不能编辑
HideFlags.HideInHierarchy    // 在层级里隐藏
HideFlags.DontSave           // 不保存到场景
HideFlags.HideAndDontSave    // 完全隐身+不保存

组合起来可以实现:

  • "你看不见"

  • "你看得见但不能动"

  • "运行完就消失"

示例代码

cs 复制代码
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;

[ExecuteInEditMode]
public class LockTest : MonoBehaviour
{
    void Update()
    {
        if (GameObject.Find("LockedObject") == null)
        {
            GameObject obj = new GameObject("LockedObject");
            obj.hideFlags = HideFlags.None;

            // obj.hideFlags = HideFlags.NotEditable;
        }
    }
}

说明:在编辑器状态(没点 Play)也会执行,每一帧都在检查,如果没有这个物体 → 就创建一个。 编辑器守护进程:

  • 你删掉对象 → 下一帧给你补回来

  • 你改名字 → 逻辑可能失效再生成

  • 你清空场景 → 它又生成

HideFlags 到底是什么

它本质是一个位标记(bitmask),可以理解为给 GameObject 打标签,告诉 Unity:"这个东西该怎么对待"。

通用工具

cs 复制代码
using UnityEditor;
using UnityEngine;

public class EditableControlMenu
{
    // =========================
    // 锁定选中对象(包含子物体)
    // =========================
    [MenuItem("Tools/Lock Selected %#l")] // Ctrl+Shift+L
    static void LockSelected()
    {
        var selection = Selection.gameObjects;

        if (selection.Length == 0)
        {
            Debug.LogWarning("No GameObject selected.");
            return;
        }

        int count = 0;

        foreach (var obj in selection)
        {
            // 避免锁 Prefab Root(重要)
            if (PrefabUtility.IsAnyPrefabInstanceRoot(obj))
            {
                Debug.LogWarning($"Skip Prefab Root: {obj.name}");
                continue;
            }

            count += ApplyToHierarchy(obj, true);
        }

        Debug.Log($"Locked {count} objects.");
    }

    // =========================
    // 解锁选中对象(包含子物体)
    // =========================
    [MenuItem("Tools/Unlock Selected %#u")] // Ctrl+Shift+U
    static void UnlockSelected()
    {
        var selection = Selection.gameObjects;

        if (selection.Length == 0)
        {
            Debug.LogWarning("No GameObject selected.");
            return;
        }

        int count = 0;

        foreach (var obj in selection)
        {
            count += ApplyToHierarchy(obj, false);
        }

        Debug.Log($"Unlocked {count} objects.");
    }

    // =========================
    // 一键解锁所有对象(救命按钮)
    // =========================
    [MenuItem("Tools/Force Unlock ALL")]
    static void UnlockAll()
    {
        var all = Object.FindObjectsOfType<GameObject>(true);
        int count = 0;

        foreach (var obj in all)
        {
            if (obj.hideFlags != HideFlags.None)
            {
                Undo.RecordObject(obj, "Force Unlock");
                obj.hideFlags = HideFlags.None;
                EditorUtility.SetDirty(obj);
                count++;
            }
        }

        Debug.Log($"Force Unlocked {count} objects (ALL).");
    }

    // =========================
    // 核心逻辑:递归处理层级
    // =========================
    static int ApplyToHierarchy(GameObject root, bool lockState)
    {
        int count = 0;

        var transforms = root.GetComponentsInChildren<Transform>(true);

        foreach (var t in transforms)
        {
            var obj = t.gameObject;

            // 已经是目标状态就跳过
            if (lockState && obj.hideFlags == HideFlags.NotEditable)
                continue;

            if (!lockState && obj.hideFlags == HideFlags.None)
                continue;

            Undo.RecordObject(obj, lockState ? "Lock Object" : "Unlock Object");

            obj.hideFlags = lockState ? HideFlags.NotEditable : HideFlags.None;

            EditorUtility.SetDirty(obj);

            count++;
        }

        return count;
    }
}

快捷键

  • Ctrl + Shift + L → 锁定对象

  • Ctrl + Shift + U → 解锁对象

注意事项

  • 仅在 Unity Editor 中有效

  • 不影响打包运行

  • 不建议锁定 Prefab Root

  • Force Unlock 会影响所有隐藏对象,请谨慎使用

获取链接

GitHub 链接

Gitee 链接

飞书云文档

Unity3D 编辑器对象锁定工具

相关推荐
云空8 小时前
《完整开源魔方项目分类清单(按用途/语言划分,含GitHub地址、核心能力、适用场景)》
开源·编程·魔方
LONGZETECH10 小时前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机
码字的特恩10 小时前
微软确认暂不为 Windows 11 加入透明效果自定义功能,建议用户使用第三方工具
人工智能·windows·算法·microsoft·计算机·大模型·编程
云空11 小时前
《软件专业完整学习路线图(本科4年+自学通用版,2026就业向)》
人工智能·科技·学习·计算机·编程·软件
五仁烧饼1 天前
Unity Addressables 静默资源策略
游戏·unity·addressables
ue星空1 天前
【Godot】更换编辑器外观主题
编辑器·游戏引擎·godot
没事学点编程小知识1 天前
免费的在线EPUB编辑器:E-Ink
编辑器
小徐不徐说1 天前
VS 2022 Visual Assist 破解
c++·visualstudio·工具·插件
fanfan_hongyun1 天前
unity 与cad 坐标系映射
unity·游戏引擎
神码编程1 天前
【Unity】 HTFramework框架(七十)MultiChoiceDropdown可多选的下拉菜单
unity·游戏引擎·ugui·dropdown·下拉菜单