Unity3D ScriptableObject使用详解
创作时间:
作者:
@小白创作中心
Unity3D ScriptableObject使用详解
引用
CSDN
1.
https://blog.csdn.net/2301_76984003/article/details/137741790
Unity3D中的ScriptableObject是一个非常实用的数据存储类,可以用来创建和管理游戏配置数据。本文将详细介绍如何使用ScriptableObject,包括创建、获取数据、使用序列化类组织数据结构,以及在简单游戏中应用配置表的方法。
创建ScriptableObject
要使用ScriptableObject,首先需要创建一个继承自ScriptableObject的类,并添加创建菜单的代码。以下是一个简单的示例:
using UnityEngine;
[CreateAssetMenu(fileName = "SOConfig", menuName = "SOConfig", order = 0)]
public class SOConfig : ScriptableObject
{
public string version;
}
创建数据文件后,可以在Unity编辑器中填写数据:
获取ScriptableObject数据
在其他脚本中,可以直接引用创建好的ScriptableObject数据文件。例如:
using UnityEngine;
public class SODemo : MonoBehaviour
{
public SOConfig config;
void Start()
{
Debug.Log($"version = {config.version}");
}
}
使用序列化类组织数据结构
除了在ScriptableObject中定义单一的字段,还可以使用类来组织数据结构。这个类需要打上[Serializable]标签:
using System;
using UnityEngine;
[CreateAssetMenu(fileName = "SOConfig", menuName = "SOConfig", order = 0)]
public class SOConfig : ScriptableObject
{
public string version;
public ConfigData configData;
}
[Serializable]
public class ConfigData
{
public string name;
public string description;
}
简单游戏配置示例
对于一些简单的小游戏来说,使用ScriptableObject做配置表会比较简单快捷。例如,一个商店的商品列表:
using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "SOShop", menuName = "SOShop", order = 1)]
public class SOShop : ScriptableObject
{
public List<SOShopItem> shopItems;
public SOShopItem GetItem(int id)
{
return shopItems.Find(x => x.id == id);
}
}
[Serializable]
public class SOShopItem
{
public string name;
public int id;
public string description;
public int price;
}
配置数据后,可以在其他脚本中使用这些配置:
using UnityEngine;
public class SODemo : MonoBehaviour
{
public SOConfig config;
public SOShop shop;
void Start()
{
for (int i = 0; i < shop.shopItems.Count; i++)
{
SOShopItem item = shop.shopItems[i];
Debug.Log($"name = {item.name} price = {item.price}");
}
}
}
动态修改配置
ScriptableObject文件中填写的数据可以在代码中赋值:
using UnityEngine;
public class SODemo : MonoBehaviour
{
public SOConfig config;
public SOShop shop;
void Start()
{
config.version = "1.0.1";
}
}
如果只想在运行时修改,不想覆盖旧值,可以让ScriptableObject创建实例:
using UnityEngine;
public class SODemo : MonoBehaviour
{
public SOConfig config;
public SOShop shop;
public SOConfig configInstance;
void Start()
{
configInstance = ScriptableObject.CreateInstance<SOConfig>();
configInstance.version = "1.0.2";
}
}
运行后,可以看到有一个ScriptableObject实例。双击查看实例数据,可以看到实例的version是1.0.2,而本地文件的version还是1.0.1。
热门推荐
微信群人数上限是多少?
纯电动汽车养护指南:从三电系统到常规保养
辣椒美食大赏:多样做法,火辣诱惑
辣椒炒干鱿鱼:鲜香麻辣的舌尖诱惑
调频连续波 SAR 与脉冲 SAR,雷达技术的双雄。
佛教“缘起性空”思想的深刻内涵
心理学:活在头脑的虚妄是心理问题的根本,回归当下开启疗愈钥匙
面试问还有什么问题,如何提问
弯曲时空:相对论下的时空和引力
引力波与黑洞物理:从基础概念到未来研究方向
时空弯曲与时间相对性:广义相对论的奇妙世界
首次!科学家成功捕获黑洞多波段“指纹”,有望检验爱因斯坦广义相对论
芡实的种植技术与管理要点
Gradle入门指南:从零开始掌握构建工具
龙美术馆十周年特展:“50——90”呈现近600件全球当代艺术佳作
龙美术馆(西岸馆)四大展览同时启幕,700多件作品呈现不同代际的艺术表达
游标卡尺和螺旋测微器的使用方法详细介绍
如何选择适合的美国技校留学项目
复旦分子考古团队破解“胡汉混血”北周武帝死因之谜
上火的番茄小说,和“慢热”的作者们
粪便DNA甲基化检测阳性意味着什么?
新老阿特兹车型的对比及选择建议是什么?
减脂与饮食,减脂与饮食的时间间隔
持续打嗝两周,男子确诊结核性脑膜炎!这些症状需警惕
湖南人的年货单谁占C位 水果、坚果、肉类、饮料、春联选购较多,更注重健康
单不饱和脂肪酸:从牛油果到橄榄油的健康之旅
民兵训练方案
打造社区教育数字化平台,创新社区治理模式
退役军人优待证最大的亮点,目前是在于公交车的免费!
选择翡翠珠子:探索不同颜色的魅力