You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity构建报错:资源标记HideFlags.DontSave却被包含进构建

问题:Unity构建时出现HideFlags.DontSave资源错误

An asset is marked with HideFlags.DontSave but is included in the build:
Asset: 'Assets/Assets/Tilesets/006/SavePoint-animation-sprite.png'
Asset name: SavePoint-animation-sprite
(You are probably referencing internal Unity data in your build.)
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

该PNG资源被用于某预制体,预制体挂载MapEvent脚本,代码如下:

using UnityEngine;
using Zenject;

[RequireComponent(typeof(Collider2D))]
public class MapEvent: MonoBehaviour
{
    #region Properties

    [Inject]
    private GameEventsSystem gameEventsSystem;

    public enum TriggerType
    {
        OnStep = 0,
        OnCollision,
        OnCollisionFacing,
        OnInteract
    }

    [SerializeField]
    private EventData eventData;
    [SerializeField]
    private TriggerType trigger = TriggerType.OnStep;

    #endregion Properties

    #region Methods

    public void OnTriggerEnter2D(Collider2D col)
    {
        if (!col.CompareTag("Player"))
            return;

        switch (trigger)
        {
            case TriggerType.OnCollision:
                PlayEvent();
                break;
        }
    }

    public void Interact()
    {
        if (trigger != TriggerType.OnInteract)
            return;
    
        PlayEvent();
    }

    private void PlayEvent()
    {
        eventData.gameObject = gameObject;
        gameEventsSystem.CallEvent(eventData);
    }

    #endregion Methods
}

关联的EventData ScriptableObject代码:

using Sirenix.OdinInspector;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif


[CreateAssetMenu]
public class EventData : ScriptableObject
{
    public GameEventsSystem.EventType eventType = GameEventsSystem.EventType.NoEvent;

    [ShowIf("eventType", GameEventsSystem.EventType.OpenDialogue)]
    public Dialogue dialogue;
    
    [ShowIf("eventType", GameEventsSystem.EventType.OpenScene)]
    [ValueDropdown("ListOfScenes")]
    public string scene;
    [ShowIf("eventType", GameEventsSystem.EventType.OpenScene)]
    public Vector3 playerPosition;
    
    [HideInInspector]
    public GameObject gameObject;

    private string[] ListOfScenes
    {
        get
        {
#if UNITY_EDITOR
            var scenes = new string[EditorBuildSettings.scenes.Length];
            
            for (var i = 0; i < EditorBuildSettings.scenes.Length; i++)
                scenes[i] = EditorBuildSettings.scenes[i].path;

            return scenes;
#else
            return new[] { scene };
#endif
        }
    }

    public object[] GetParams()
    {
        return eventType switch
        {
            GameEventsSystem.EventType.OpenDialogue => new object[] {dialogue},
            GameEventsSystem.EventType.OpenScene => new object[] {scene, playerPosition},
            GameEventsSystem.EventType.GrabPot => new object[] {gameObject},
            _ => new object[] { }
        };
    }
}

未手动设置HideFlags.DontSave,需解决该构建错误。


解决方案

1. 修复ScriptableObject的运行时赋值问题

错误核心原因是:你在PlayEvent方法中给EventData(ScriptableObject)的gameObject字段赋值了场景对象。ScriptableObject是项目资源,运行时修改它会导致Unity错误标记其关联资源为DontSave。

修改方案:

  • 不要直接修改ScriptableObject的字段,改为临时传递参数:
    更新MapEvent的PlayEvent方法:
    private void PlayEvent()
    {
        // 直接传递GameObject作为CallEvent的参数,不修改ScriptableObject
        gameEventsSystem.CallEvent(eventData, gameObject);
    }
    
  • 同步修改GameEventsSystem.CallEvent方法,新增GameObject参数,避免污染ScriptableObject实例。

2. 手动重置资源的HideFlags标记

创建一个Editor工具脚本,批量重置选中资源的HideFlags:

using UnityEditor;
using UnityEngine;

public class ResetAssetHideFlags : EditorWindow
{
    [MenuItem("Tools/Reset Asset Hide Flags")]
    public static void OpenTool()
    {
        GetWindow<ResetAssetHideFlags>("Reset Hide Flags");
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Reset Selected Assets' Hide Flags"))
        {
            foreach (Object selectedObj in Selection.objects)
            {
                selectedObj.hideFlags = HideFlags.None;
                EditorUtility.SetDirty(selectedObj);
            }
            AssetDatabase.SaveAssets();
            Debug.Log("Selected assets' hide flags reset to None");
        }
    }
}

使用步骤:

  1. 选中报错的PNG资源
  2. 点击顶部菜单栏Tools/Reset Asset Hide Flags
  3. 点击工具窗口中的重置按钮,重新构建项目

3. 刷新预制体与资源的引用

  • 打开使用该PNG的预制体,移除Sprite引用后重新添加,保存预制体
  • 备份项目后删除Library文件夹,让Unity重新生成资源缓存

4. 排查第三方插件影响

项目使用了Odin Inspector和Zenject,可临时排查:

  • 注释掉Odin的特性标签(如[ShowIf]、[ValueDropdown]),重新构建测试
  • 检查Zenject的注入逻辑是否对资源对象有特殊处理,尝试临时禁用注入测试

内容的提问来源于stack exchange,提问作者ThomasSquall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:27:02