本帖最后由 感情偏食BZ8 于 2023-11-29 16:21 编辑
在游戏的版本迭代中,我们经常会遇到一些游戏保存的数据发生变化和升级的情况,这里记录一下开发中遇到数据升级变化的情况。
首先 关于游戏数据中 两个方法的区别
protected initDefaultData(): void {
this.gameData = 1;
}
protected onDataInit(): void {
}
如上所示 initDefaultData() 的描述是 初始化默认数据 ,换种表达就是 如果没有当前的数据,即第一次进入游戏或者迭代后新的 subdata 的模块的情况 这个方法才会被调用
而 onDataInit() 的描述是游戏数据初始化完成后调用 , 换个表达 , 不管当前有没有数据 这个方法都会被调用, 即玩家每次进入游戏都会被调用一次
其次,我们需要了解编辑器为我们提供的两个属性 currentVersion和 version这两个属性
我们先来看下存档里默认的一个versino
上图所示这个存档创建以后会有一个默认的version,值是0 ,当我们使用 this.currentVersion时实际上是这个存档里面的version
而如下代码中的this.Version 是你当前存档的最新版本 , 我们需要重新写下get方法,每次需要版本更新时,最简单的方法就是写 当前版本+1
protected onDataInit(): void {
console.log("数据初始化")
if (this.currentVersion != this.version) {
//数据更改内容
}
//数据升级以后保存
this.save(false);
}
//这里表示当前存档的版本如果之前存档是0 那下面就改成 return 1 以此类推
get version() {
return 0;
}
最后,我们也必须要考虑回归玩家:跳跃版本的升级 比如从初版的存档到最新版本的存档,中间的跨度可能有好多的版本,这个时候我们可以考虑使用如下代码中的whlie循环进行一个连续的版本升级,但是代码的最后务必保证 this.currentVersion == this.Version
protected onDataInit(): void {
console.log("数据初始化")
while (this.currentVersion != this.version) {
switch (this.currentVersion) {
case 0:
this._gameData1 = 2;
break;
case 1:
this._gameData1 = 3;
break;
}
//对版本进行竹本的升级
if (this.currentVersion < this.version) {
this.currentVersion = this.currentVersion + 1;
}
else {
this.currentVersion = this.version;
}
}
//数据升级以后保存
this.save(false);
}
OK 如此之我们的游戏数据升级之路就算完成了
PS:上面那个存档的话如果要初始化好需要先被调用一下哦,否则是看不到的
|