news 2026/4/18 8:17:03

1.6 ScriptableObject

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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("数据已重置并保存");}}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:26:11

Flutter for OpenHarmony 实战:Switch 开关按钮详解

Flutter for OpenHarmony 实战&#xff1a;Switch 开关按钮详解&#x1f4a1; 摘要&#xff1a;本文将深度解析 Flutter 框架中 Switch 开关按钮在 OpenHarmony 平台的应用实践。通过剖析其核心属性、事件响应机制、样式定制技巧及跨平台适配方案&#xff0c;结合 5 个可验证代…

作者头像 李华
网站建设 2026/4/17 15:11:18

Flutter for OpenHarmony 实战:Slider 滑块控件详解

Flutter for OpenHarmony 实战&#xff1a;Slider 滑块控件详解 摘要 本文深度解析 Flutter 框架在 OpenHarmony 平台中 Slider 滑块控件 的核心用法与技术实践。内容涵盖基础属性配置、样式定制化技巧、跨平台事件处理机制&#xff0c;以及鸿蒙原生控件与 Flutter 实现的对比方…

作者头像 李华
网站建设 2026/4/18 3:38:24

SiC碳化硅MOSFET微观动力学综述:开关瞬态全景解析

基本半导体B3M系列SiC碳化硅MOSFET微观动力学综述&#xff1a;开关瞬态全景解析BASiC Semiconductor基本半导体一级代理商倾佳电子&#xff08;Changer Tech&#xff09;是一家专注于功率半导体和新能源汽车连接器的分销商。主要服务于中国工业电源、电力电子设备和新能源汽车产…

作者头像 李华
网站建设 2026/4/17 13:47:25

RAG核心技术解析:检索方式与文档切片逻辑

RAG(检索增强生成):检索方式、文档切片(Chunking)的实现逻辑 目录 一、RAG的核心检索方式 1. 基于向量的检索(Vector Retrieval) 核心原理 实现方式 代码实例(基于Chroma+Sentence-BERT) 2. 关键词检索(Keyword Retrieval) 核心原理 实现方式 代码实例(基于Elastic…

作者头像 李华