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

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)

Unity 在开发的时候如果数据量比较大,或者一部分数据需要存在云端,那么就需要一些数据库

轻量型到大型的包括:

数组-内存存储读取

列表-内存存储读取   List<T> tList = new List<T>();

XML-硬盘存储读取

JSON-硬盘存储读取

Sqlite-轻量数据库(意思就是免安装)-云服务器、硬盘存储读取SQLite 入门教程 - 菜鸟教程

Mysql-关系型数据库(需安装本地或云服务器)-云服务器、硬盘存储读取

Redis-非关系型数据库-轻量级免安装-云服务器、硬盘存储读取

Oracle-系型数据库(需安装本地或云服务器)-云服务器、硬盘存储读取

......

 

using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(menuName = "Leoyang/DataUnity", fileName = "CreatData")]
public class PackageTable : ScriptableObject
{public List<ObjectInformation> DatatList=new List<ObjectInformation>();
}
[System.Serializable]
public class ObjectInformation
{public string name;public int ID;public string DescriptObj;
}

这段代码是针对 Unity 引擎的脚本,用于创建包含物品信息的数据表。

1. CreateAssetMenu 属性:


   这个属性是 Unity 引擎的特殊标记,用于在 Unity 菜单中创建该类型的对象。`menuName` 指定了在菜单中的位置,`fileName` 指定了在创建对象时的默认文件名。

[CreateAssetMenu(menuName = "Leoyang/DataUnity", fileName = "CreatData")]

代码效果:

2. `PackageTable` Unity 内置类:


PackageTable` 类继承自 `ScriptableObject`,这是一个 Unity 提供的特殊类可以在编辑器中创建和管理数据。
List<ObjectInformation> DatatList` 是一个包含 `ObjectInformation` 对象的列表,用于存储ObjectInformation类型的物品信息。

3. ObjectInformation 自定义类:


ObjectInformation`是一个用于存储单个物品信息的自定义类。
 它包含了物品的名称 (`name`)、ID (`ID`) 和描述 (`DescriptObj`) 等字段,用于描述和标识不同的游戏物品。

这段代码的作用是创建一个可以在 Unity 编辑器中创建和管理的数据表,其中可以存储多个物品的信息,比如名称、ID 和描述等。通过 `PackageTable` 类的 `DatatList` 可以轻松地添加、编辑和删除 `ObjectInformation` 类的对象,这些对象可以在游戏中使用,比如用于管理背包物品或者游戏中的其他数据。

创建完毕后就可以使用了,存储信息

4.ScriptableObject类详细讲解

`ScriptableObject` 是 Unity 引擎中的一个特殊类,它允许在编辑器中创建可序列化的对象,用于存储数据、配置游戏资源、或者创建自定义编辑器工具等。下面详细介绍它的属性、功能和一个简单的案例:

- **可序列化:** `ScriptableObject` 类的对象可以被序列化和存储在 Unity 资源文件中,能够在不同场景和关卡之间进行持久化。
  
- **无需挂载到 GameObject:** 与 MonoBehaviour 不同,ScriptableObject 并不需要附加到场景中的游戏对象上,因此它们不受场景的影响,更适合用于存储数据或资源。

### 功能:

- **数据存储和配置:** 可以用来保存游戏的数据,例如存储关卡信息、物品属性、对话内容等。也可用于配置资源,如配置文件、技能数据、AI行为树等。

- **可编辑:** 可在 Unity 编辑器中创建、编辑和管理对象的属性和数据。这使得开发人员可以方便地调整数据而无需直接修改代码。

- **易于扩展:** 可以创建自定义编辑器工具,利用 `ScriptableObject` 创建可重复使用的资源,提高了代码的复用性。

### 案例:

以下是一个简单的 `ScriptableObject` 示例,演示了如何创建和使用它:
 

using UnityEngine;[CreateAssetMenu(fileName = "NewCharacterData", menuName = "Character Data")]
public class CharacterData : ScriptableObject
{public string characterName;public int health;public int attackDamage;public Sprite characterSprite;
}

- 这个示例中的 `CharacterData` 类继承自 `ScriptableObject`。
- 使用 `[CreateAssetMenu]` 属性,指定了在 Unity 菜单中创建该类型对象时的位置和名称。
- `CharacterData` 类定义了一些角色的属性,如角色名、生命值、攻击伤害和角色的精灵图像。

通过这种方式,可以在 Unity 编辑器中创建名为 Character Data 的资源文件,包含了角色的属性信息。然后可以在游戏中通过引用这些 `CharacterData` 对象来获取或配置角色属性,例如在游戏中创建角色、设置角色的生命值和攻击力等。

一旦你创建了 `ScriptableObject` 类型的数据对象并设置了其中的属性,你可以通过代码在游戏中访问这些属性。以下是一种简单的方法:

假设你已经创建了一个名为 `CharacterData` 的 `ScriptableObject` 类,里面包含了角色的属性,比如:

using UnityEngine;[CreateAssetMenu(fileName = "NewCharacterData", menuName = "Character Data")]
public class CharacterData : ScriptableObject
{public string characterName;public int health;public int attackDamage;public Sprite characterSprite;
}

然后,在你的代码中,你可以通过如下方式获取这些数据:


public class CharacterManager : MonoBehaviour
{public CharacterData characterData; // 这个是你创建的 CharacterData 对象void Start(){// 示例:输出角色的名字和生命值Debug.Log("Character Name: " + characterData.characterName);Debug.Log("Character Health: " + characterData.health);// 可以根据需要使用角色数据做其他操作,比如改变角色的属性、加载对应的角色模型等。}
}


 

这段代码展示了如何在 `CharacterManager` 类中获取 `CharacterData` 对象的属性。通过将 `CharacterData` 对象赋值给 `characterData` 属性,你可以在 `Start` 或其他需要的地方访问其中的属性。可以根据具体需求,使用这些数据来配置游戏中的角色属性、加载对应的精灵图像或者其他处理。

相关文章:

  • 播放器开发(六):音频帧处理并用SDL播放
  • Python版本与opencv版本的对应关系
  • 更简单的Redux工具 Toolkit
  • 日志收集 grafana-loki
  • IntelliJ IDEA图形安装教程
  • MySQL 临时数据空间不足导致SQL被killed 的问题与扩展
  • 防火墙补充NAT
  • html和css写淘宝的快速导航条
  • 多路径传输(MPTCP MPQUIC)数据包调度研究总结
  • 加密系统,您的数据安全守护者,助您远离泄露风险!
  • Java多线程:代码不只是在‘Hello World‘
  • 【Openstack Train安装】十一、Dashboard 安装
  • 计算机网络(二)| 物理层上 | 数据通信基础知识 调制 频率范围 信噪比
  • Django之admin后台页面功能详解
  • 1.1美术理论基础
  • 【RocksDB】TransactionDB源码分析
  • 5、React组件事件详解
  • Angular4 模板式表单用法以及验证
  • java8-模拟hadoop
  • Java知识点总结(JavaIO-打印流)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js数组之filter
  • MySQL几个简单SQL的优化
  • PHP面试之三:MySQL数据库
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring Boot MyBatis配置多种数据库
  • SSH 免密登录
  • Webpack 4x 之路 ( 四 )
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 基于 Babel 的 npm 包最小化设置
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​flutter 代码混淆
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​比特币大跌的 2 个原因
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (day 12)JavaScript学习笔记(数组3)
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (六)软件测试分工
  • (三) diretfbrc详解
  • (五)关系数据库标准语言SQL
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)关于多人操作数据的处理策略
  • .gitattributes 文件
  • .NET 设计一套高性能的弱事件机制
  • .NET 药厂业务系统 CPU爆高分析
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】