当前位置: 首页 > news >正文

【unity】运行时加载并修改ScriptableObject类型资源对象的值会怎样

Q: 我有一个继承ScriptableObject的类,做成资源放在项目中,使用时用Resources.Load加载、读取其中的数据。如果在运行中修改该对象上的某个值,改动的是项目中的资源吗?下次再加载它,这个数值会怎样?

A: 不会修改项目中的原始资源文件,但会修改当前运行时加载的实例。

让我详细解释:


运行时修改的真相

当你使用 Resources.Load<YourSOType>("path/name") 时:

  1. 第一次加载:Unity从项目的Resources文件夹中读取原始资源数据,在内存中创建该ScriptableObject的一个实例

  2. 修改数值:你修改的是内存中的这个运行时实例的值。

  3. 再次加载

    • 如果你再次调用 Resources.Load 同一个路径,默认情况下Unity会返回同一个内存实例(除非你手动销毁了它)。

    • 所以你会看到之前修改后的值。

  4. 在 发布后的构建版本 中运行时:修改仅存在于内存中,不会影响磁盘上的资源文件。

  5. 下次加载时的数值:
    • 在同一个游戏会话中:如果你再次用 Resources.Load 加载同一个资源,默认情况下你会得到同一个实例,所以会看到修改后的值
    • 重启游戏后:所有修改都会丢失,加载到的是原始资源的值

这样的设计让 ScriptableObject 既可以用作配置数据,也可以用作运行时的状态容器,非常灵活。

验证代码:

// 你的ScriptableObject
[CreateAssetMenu(fileName = "TestData", menuName = "Test/TestData")]
public class TestData : ScriptableObject
{public int testValue = 10;
}// 测试脚本
public class TestScript : MonoBehaviour
{void Start(){// 第一次加载TestData data1 = Resources.Load<TestData>("TestData");Debug.Log($"第一次加载: {data1.testValue}"); // 输出: 10// 修改值data1.testValue = 99;Debug.Log($"修改后: {data1.testValue}"); // 输出: 99// 再次加载(同一个路径)TestData data2 = Resources.Load<TestData>("TestData");Debug.Log($"再次加载: {data2.testValue}"); // 输出: 99Debug.Log($"是同一个实例吗: {data1 == data2}"); // 输出: True}
}

关键行为总结

场景结果
运行时修改后,再次Resources.Load得到修改后的值(同一个实例)
停止游戏,重新运行恢复原始值(重新从磁盘加载)
构建发布后永远使用原始值(资源被编译进包内)

如果你真的需要持久化修改

如果你希望运行时修改能真正保存到项目文件中,需要特殊处理:

#if UNITY_EDITOR
public void SaveChangesToAsset(TestData data)
{UnityEditor.EditorUtility.SetDirty(data);  // 标记为"脏"UnityEditor.AssetDatabase.SaveAssets();    // 保存到磁盘UnityEditor.AssetDatabase.Refresh();       // 刷新数据库
}
#endif

但要注意:

  • 这只能在Editor模式下使用,发布后的版本无法修改原始资源文件

  • 通常不推荐这样做,因为会永久改变项目资源


如果你想避免修改原始资源(在编辑器模式下):

// 创建实例的副本进行操作
public void ModifyConfigSafely()
{GameConfig original = Resources.Load<GameConfig>("GameConfig");// 创建实例副本GameConfig runtimeCopy = Instantiate(original);runtimeCopy.playerHealth = 50;// 现在修改的是副本,不影响原始资源
}

实际开发建议

  1. 如果需要运行时临时修改:直接修改加载的实例即可。

  2. 如果需要持久化存档:应该使用PlayerPrefs、JSON/XML文件、或专门的存档系统,而不是修改ScriptableObject资源。

  3. 如果需要配置不同的数据变体:创建多个ScriptableObject资源实例,而不是运行时修改单个实例。

所以简单回答你的问题:下次加载会得到修改后的值,但仅限于本次游戏会话中。重启游戏后会恢复原始值。

http://www.dtcms.com/a/520144.html

相关文章:

  • Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)
  • 服装企业官方网站建设网站运营收入
  • Spring Boot Actuator深度解析与实战
  • 如何做 行业社交类网站网站 建设在作用
  • 线程3 JavaEE(阻塞队列,线程池)
  • K8s中,deployment 是如何从 yaml 文件最终部署成功 pod 的
  • RK3588 使用 FFmpeg 硬件解码输出到 DRM Prime (DMA Buf) 加速数据传输
  • 基于蚁群算法的PID参数整定方法及MATLAB实现
  • 排序算法大全——插入排序
  • 手搓一个CUDA JIT编译器
  • 网站引导页模板互联网公司排名全球
  • JDK 9 List.of(...)
  • 做一个vue3 v-model 双向绑定的弹窗
  • 为超过10亿条记录的订单表新增字段
  • 哪里做网站最便宜WordPress功能模块排版
  • 每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
  • 薄膜测厚选CWL法还是触针法?针对不同厚度与材质的台阶仪技术选型指南
  • WPF-MVVM的简单入门(第一个MVVM程序)
  • blender拓扑建模教程
  • asp.net手机网站开发教程翻译网站建设方案
  • 佛山建设网站公司哪家好特斯拉ceo进厂拧螺丝
  • 如何做新网站保留域名wordpress基础
  • C# 实现 Modbus TCP 通信
  • 《Git:从入门到精通(七)——Git分支管理与协作开发实战》
  • 超越传统工具:利用Reddit发现关键词的独特视角与前沿方法
  • 数据结构——二叉搜索树深度解析
  • macOS 无法在根目录创建目录的原因与解决方案
  • 11.23 鸿蒙HTTP数据请求
  • 郑州网站建设最低价网址导航的意思
  • LOESS回归