[开发者心得] 【从零使用数据存储】🎡零基础也能快速学会使用!

[复制链接]
1215 |2
空伊伊 发表于 2023-2-20 15:04:27 | 显示全部楼层 |阅读模式

本帖最后由 空伊伊 于 2023-11-8 17:41 编辑

一、基础:存取「一个」数据

假设 「一条」数据包含:名字、等级、金币、背包,那么就把其中的一个字段称为「一个」数据

1.存「一个」数据(asyncSetData)

@Component
export default class GameStart extends Script {
    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        // 存储数据只能在服务端执行生效
        if (SystemUtil.isServer()) {
            // 存数据
            DataStorage.asyncSetData("name", "空伊伊")
        }
    }
}
dataSave20231010 运行效果(右侧图片): 运行上述代码,会在项目根目录下创建一个DBCache文件夹, 该文件夹会在本地存储调用asyncSetData后生成的数据

2.取「一个」数据(asyncGetData)

@Component
export default class GameStart extends Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected async onStart(): Promise<void> {

        // 存储数据只能在服务端执行生效
        if (SystemUtil.isServer()) {
            // // 存数据
            // DataStorage.asyncSetData("name", "空伊伊")

            // 取数据
            let result = await DataStorage.asyncGetData("name")
            // 将获取到的数据打印出来
            console.log(result.data)
        }
    }
}
image-20231010143932489 运行效果(右侧图片): 运行上述代码,根据键"name"去取到对应的值并打印出来 注意 asyncGetData 是一个异步方法,必须加await去等待数据获取完成,因为获取数据不会在当前帧就立马执。如果不加await,那么接收到的就只是一个Promise对象,并不是具体的数据

3.存取「一个」数据的缺点

🧑将一条数据拆成一个一个的来存

img

假如我现在需要保存上方的数据,那么我通过一个一个的保存,可以执行下面的代码:

DataStorage.asyncSetData("name", "空伊伊")
DataStorage.asyncSetData("level", "22")
DataStorage.asyncSetData("gold", "300")
DataStorage.asyncSetData("bag", "手枪,飞镖,瓶子")

👇执行结果

image-20231010144218207

缺点

  • 1.当数据字段多起来的时候,这样一个一个的存储,会导致数据文件过多,不方便管理和查看
  • 2.获取到的数据,不知道对应的类型,难以使用

二、核心:存取「一条」数据

如果一条数据包含:名字、等级、金币、背包。那么就把这条数据称为「一条」数据

1.定义一个数据结构

如下,用一个class来作为数据结构是最为合适的,因为你自己可以定义字段的类型,还能写一些操作数据的方法

export class DataInfo {
    /**角色姓名 */
    roleName: string
    /**角色等级 */
    level: number
    /**金币 */
    gold: number
    /**背包 */
    bag: string[]

    constructor(name: string, level: number, gold: number, ...param: string[]) {
        this.roleName = name
        this.level = level
        this.gold = gold
        this.bag = param
    }
}

img

可以看到,将数据转换成JSON格式进行存储,在获取数据的时候就能将数据还原为数据结构,很方便 另外需要注意!!!!!!!!!! Map这种数据结构,进行序列化会出错,所以尽量避开使用

2.存取数据

由于 asyncSetData 和 asyncGetData 内部已经帮我们执行了JSON和数据结构的转换,所以使用这两个API来存数据,就不需要我们进行格式转换了

2.1存一条数据

// 方法1:
// 创建一条数据
let data1 = new DataInfo("空伊伊", 22, 300, "手枪", "飞镖", "瓶子")
// 传入自定义的键值
DataStorage.asyncSetData("Player1", data1)

// 方法2:
let data2 = { "roleName": "空伊伊", "level": "22" }
DataStorage.asyncSetData("Player1", data2)

2.2取一条数据

// 方法1:
// 取数据(记得一定要异步!)
let result = (await DataStorage.asyncGetData("Player1"))
let data = result.data as DataInfo
// 打印数据
console.log(data.roleName, data.level, data.gold, data.bag)

// 方法2:
let data = (await DataStorage.asyncGetData("Player1")).data
console.log("2222 ", data["roleName"], data["level"])

imgimgimgimg

😈

回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-2-21 11:19:36 | 显示全部楼层
可以讲讲constructor在里面起到什么作用吗?什么是constructor?为什么要 this.level = level?
回复

使用道具 举报

空伊伊楼主 发表于 2023-2-21 13:04:41 | 显示全部楼层
叽里咕噜小胡桃 发表于 2023-2-21 11:19
可以讲讲constructor在里面起到什么作用吗?什么是constructor?为什么要 this.level = level? ...

constructor是构造函数,方便你快速实例化一个class,以及做一些初始化的操作。同时这个constructor不写也是可以的,不影响你使用new创建一个对象
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表