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"); } } }
使用步骤:
- 选中报错的PNG资源
- 点击顶部菜单栏
Tools/Reset Asset Hide Flags - 点击工具窗口中的重置按钮,重新构建项目
3. 刷新预制体与资源的引用
- 打开使用该PNG的预制体,移除Sprite引用后重新添加,保存预制体
- 备份项目后删除
Library文件夹,让Unity重新生成资源缓存
4. 排查第三方插件影响
项目使用了Odin Inspector和Zenject,可临时排查:
- 注释掉Odin的特性标签(如
[ShowIf]、[ValueDropdown]),重新构建测试 - 检查Zenject的注入逻辑是否对资源对象有特殊处理,尝试临时禁用注入测试
内容的提问来源于stack exchange,提问作者ThomasSquall
相关产品推荐
相关产品推荐

