沙盘引擎 (SEngine)

创意诞生沙盘世界,不止如此想象!

用户工具

站点工具


侧边栏

developer:mod:savedata

📚 游戏数据存档

在《沙盘引擎》主世界设计概念中,考虑到不同模组作品可能有不同的处理机制,所以引擎没有内置关于“存档”或者“保存”的概念和功能。

如果某个模组衍生作品需要有“存档”的功能,这需要模组开发者根据游戏玩法自行实现。

存档思路:可利用World端API进行遍历要保存的内容,然后使用Json、SQLite等方式进行保存以及下次读取。

📒 存档实现方案

由于不同模组可能有不同类型的玩法机制,所以默认引擎不提供统一的存档方法。

例如:快节奏PK对战类玩法并不需要存档的功能(除非是保存玩家的排行账户这些),通常没有必要保存地图的载具位置、拾取物位置或者玩家的背包内容,因为可能每次开局都是会更换重置的。

相反来说,像是大型地图生存类模组玩法,可能希望实现玩家下线、服务器关闭后仍然可以保存玩家数据和载具位置等,这就可以利用Json或者SQLite等方式根据自己的想法进行存档,等到需要的时候(可能当世界被建立后、玩家进入服务器后)进行对应读取。

沙盘引擎内置几个推荐用的持久化数据储存方式(如JSON\SQLite等),具体代码使用内容可参考脚本开发——原生通用

存档方案 使用场景
SE.Json 适合简单或普通、不会特别复杂的数据,没有频繁存档的需求
Json类型本身是基于文本存在的,但更可读且精简,可以进行基础存档或配置文件使用
SE.SQLite 适合普通或复杂的数据,因为是数据库结构,所以也可以把整个游戏或服务器数据存储到一个db文件
数据库类型存储方式原生就适合存储大量或复杂的数据,在某些复杂的玩法模组、网游服务器方面更适合存储

📒 存档方案示例

需求:为当前模组服务器的每个玩家都设置存档功能(类似玩家账户功能)。

场景:这是一个生存玩法模组,玩家A建立了一个此模组的服务器,他希望服务器关闭、存档或者玩家下线后,等到下次玩家上线仍然可以保存玩家数据。

分析:需要保存的数据应该有玩家UUID(而不是名字,因为玩家可能会改名字,UUID是唯一的标识值)、玩家背包数组序列化(比如数组转json文本)、玩家坐标序列化、玩家关键属性序列化(比如血量这些需要存档的内容)等……

可以自行编写一个封装函数,在合适的事件或实际进行Save或Load调用即可。

//伪代码示例,仅提供思路,具体可参考【脚本开发】文档
 
class PlayerStatus
{
	UUID = "";
	BackpackData = [];
	Pos = null;
	Health = 100;
}
 
Table PStatus = PlayerStatus[100]; //创建一个100个槽位(玩家最大数量)的数组或表
 
function OnPlayerJoin( player )
{
	PStatus[player.ID] = new PlayerStatus();
    LoadAccount(player);
}
 
function OnPlayerPart( player )
{
    SaveAccount(player);
}
 
function LoadAccount( player )
{
	JsonData getData = xxx; //寻找相同player.UUID的数据组,如果找到说明有存档
 
    if(getData)
    {
        PStatus[player.ID].BackpackData = getData.BackpackData;
        PStatus[player.ID].Pos = getData.Pos;
		PStatus[player.ID].Health = getData.Health;
    }else{
        //新玩家,无存档
    }
}
 
function SaveAccount( player )
{
    JsonData saveData = new JsonData();
    saveData.BackpackData = PStatus[player.ID].BackpackData;
    saveData.Pos = PStatus[player.ID].Pos;
    saveData.Health = PStatus[player.ID].Health;
 
	saveData.Save(xxx);
}

📒 存档方案思路扩展

沙盘引擎在设计方面尽可能做到了易用与高扩展的平衡,对于一些基础或并不特别复杂的游戏来说,使用Json或者SQLite等方式存储已经可以满足绝大部分需求。

但是,无论使用专业的游戏开发引擎还是《沙盘引擎》,一些开发者需要提前考虑到的思维是必不可少的。

我们上文已经介绍了如何存档以及使用方式,但是在实际游戏开发到【存档内容】部分时,仍然有一些问题需要开发者来解决。

沙盘引擎本身支持许多地图,模组作品大概率也支持至少1张以上的地图,那么如果玩家中途想要更换地图,那么现在的存档如何处理?

是强制要求玩家一个地图一个存档吗?还是现在的存档(开发者自定义逻辑)可以做到兼容任何地图?

模组作品是要做成【服务器】模式的存档?还是制作成主机游戏本地存档的方式?

这个问题与开发者具体制作的模组作品类型息息相关,并不是简单几句话就能全部概括和解决的问题,这里只是提供一个引子,具体的开发者应该有所思考。

在开始制作一个模组作品之前,开发者就应该想好游戏是否拥有存档以及游戏存档方式及冲突解决

📘 存档方案举例A

开发者制作的是一种即时对战的游戏,例如《CS:GO》这种可能会经常更换地图的游戏。

首先来说,这类游戏应该没有需要保存游戏世界内容的地方,因为每局的经济系统属于服务器实时数据,不属于保存内容。

以笔者个人的理解,可能更多要倾向于打造一个【XXX对战服务器】。

既然这样,可能就需要保存的是服务器玩家数据而不是玩家的世界内数据,这样开发者就可以建立一个SQLite数据库,让每个服务器玩家在进入和退出时分别读取和写入数据(例如服务器等级、杀敌数、死亡数、其他统计信息等)。

developer/mod/savedata.txt · 最后更改: 2023/03/16 17:24 由 127.0.0.1