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

1.6 ScriptableObject

1.ScritableObject简介


1.ScritableObject简介

ScritableObject是继承自UnityEngine.Object的特殊基类,用于保存数据;它是纯数据 文件,独立于GameObject存在,没有生命周期函数,只负责存储数据(数值,素材引用,配置 等),数据保存在.asset格式的资源文件中,可在Inspector面板直接编辑
usingUnityEngine;// [CreateAssetMenu] 让你能在Project窗口右键创建该资源(新手首选)[CreateAssetMenu(fileName="NewCharacterConfig",// 默认文件名menuName="MyGame/Character Config"// 右键菜单路径(MyGame是自定义分类))]publicclassCharacterConfig:ScriptableObject{// 可序列化的字段(public或加[SerializeField]),会在Inspector显示[Header("基础属性")]// 分组注释,方便阅读publicstringcharacterName;publicintmaxHP=100;publicfloatmoveSpeed=5f;[Header("战斗属性")]publicintattackDamage=10;publicfloatattackRange=2f;[Header("素材引用")]publicSpritecharacterIcon;// 引用贴图资源publicAudioClipattackSound;// 引用音频资源}

发布游戏的核心方案:将ScriptableObject的结构化数据序列化为 JSON 文件,保存到 Unity 的PersistentDataPath(唯一安全的运行时持久化路径);游戏启动时,再从 JSON 文件加载数据并覆盖回ScriptableObject实例
usingUnityEngine;usingSystem.IO;// 1. 定义与ScriptableObject数据结构一致的普通C#类(用于序列化,避免直接序列化ScriptableObject)[System.Serializable]publicclassGameDataSaveModel{publicintplayerLevel;publicintgold;publicfloatplayerHP;// 从ScriptableObject赋值到序列化模型publicstaticGameDataSaveModelFromScriptableObject(GameDatadata){returnnewGameDataSaveModel{playerLevel=data.playerLevel,gold=data.gold,playerHP=data.playerHP};}// 从序列化模型赋值回ScriptableObjectpublicvoidToScriptableObject(GameDatadata){data.playerLevel=this.playerLevel;data.gold=this.gold;data.playerHP=this.playerHP;}}// 2. 改造ScriptableObject,添加运行时保存/加载方法[CreateAssetMenu(fileName="GameData",menuName="MyGame/GameData")]publicclassGameData:ScriptableObject{publicintplayerLevel=1;publicintgold=1000;publicfloatplayerHP=100f;// 保存路径(PersistentDataPath:不同平台的持久化路径,打包后可读写)privatestringSavePath=>Path.Combine(Application.persistentDataPath,"GameDataSave.json");// 运行时保存数据到JSON文件(编辑器/打包后都可用)publicvoidSaveRuntimeData(){// 创建序列化模型并赋值GameDataSaveModelmodel=GameDataSaveModel.FromScriptableObject(this);// 序列化为JSON字符串(带格式化,方便查看)stringjson=JsonUtility.ToJson(model,true);// 写入文件(不存在则创建,存在则覆盖)File.WriteAllText(SavePath,json);Debug.Log($"运行时数据已保存到:{SavePath}");}// 运行时加载JSON数据到ScriptableObjectpublicvoidLoadRuntimeData(){// 检查文件是否存在if(!File.Exists(SavePath)){Debug.LogWarning("保存文件不存在,使用默认数据");return;}// 读取JSON字符串stringjson=File.ReadAllText(SavePath);// 反序列化为模型GameDataSaveModelmodel=JsonUtility.FromJson<GameDataSaveModel>(json);// 赋值回ScriptableObjectmodel.ToScriptableObject(this);Debug.Log($"已从{SavePath}加载数据:等级={playerLevel},金币={gold}");}}// 3. 测试脚本(挂载到启动场景的GameObject)publicclassGameDataManager:MonoBehaviour{publicGameDatagameData;// 拖拽赋值你的GameData.assetvoidStart(){// 游戏启动时自动加载保存的数据gameData.LoadRuntimeData();}voidUpdate(){// 按S键保存数据if(Input.GetKeyDown(KeyCode.S)){gameData.playerLevel+=1;gameData.gold+=500;gameData.playerHP-=10f;gameData.SaveRuntimeData();}// 按R键重置数据(测试用)if(Input.GetKeyDown(KeyCode.R)){gameData.playerLevel=1;gameData.gold=1000;gameData.playerHP=100f;gameData.SaveRuntimeData();Debug.Log("数据已重置并保存");}}}

http://www.jsqmd.com/news/235150/

相关文章:

  • 到处都说Claude Code和Skills,免费免注册用户使用了一下
  • 智慧边检空间智能平台建设方案——基于空间视频感知与统一空间智能底座的新一代边检监管体系
  • [微机原理与系统设计-从入门到入土] 输入输出IO
  • Flutter for OpenHarmony 实战:TextButton 文本按钮详解
  • Langfuse:开源LLM工程平台全解析
  • 基于深度学习的火焰烟雾识别系统
  • 【epub2pdf 转换器】OSError: cannot load library ‘libgobject-2.0-0‘: dlopen
  • RAG核心技术解析:检索方式与文档切片逻辑
  • RAG核心技术解析:检索方式与文档切片逻辑
  • [微机原理与系统设计-从入门到入土] 总线Bus
  • Flutter for OpenHarmony 实战:OutlinedButton 边框按钮详解
  • Flutter for OpenHarmony 实战:OutlinedButton 边框按钮详解
  • AI元人文:人机共生实验室战略提案
  • 基于yolov10的吸烟检测系统
  • 基于yolov10的吸烟检测系统
  • 2026年最新论文降ai全攻略,教你如何快速实现aigc免费降重并降低ai率。
  • RAG优化:rerank+小模型整理提升精度
  • [微机原理与系统设计-从入门到入土] 存储器Memory
  • Flutter for OpenHarmony 实战:IconButton 图标按钮详解
  • 大数据领域的政务应用
  • 飞腾系列——FT-M6678模板匹配算法的实现与优化
  • Flutter for OpenHarmony 实战:RangeSlider 范围控件详解
  • springboot个人博客系统(11677)
  • 在典型的RAG(检索增强生成)系统中,对知识库片段进行编码的**通常不是完整的LLM,而是专门用于生成文本向量表示的“文本嵌入模型” 但是也是transform 结构,仅仅是层级比较少,6-12;说
  • 如何构建生物制药企业一体化管理体系,赋能全产业链协同?
  • Flutter for OpenHarmony 实战:ElevatedButton 悬浮按钮详解
  • 学长亲荐8个AI论文平台,自考毕业论文轻松搞定!
  • Flutter for OpenHarmony 实战:RangeSlider 范围滑块详解
  • Termius用法科普
  • 基于SpringBoot的论坛系统(11678)