共计 3589 个字符,预计需要花费 9 分钟才能阅读完成。
本地存储插件使用指南
本地存储插件可以在用户设备上本地存储数据。例如,它可用于存储个人最佳高分。请注意,如果您想要全状态保存和加载功能,请参阅如何制作保存游戏。
本地存储离线工作
本地存储离线工作,因为它将数据存储到设备本身。不同的浏览器使用不同的存储,因此数据不会在同一台计算机上的不同浏览器之间共享 – 每个浏览器都有自己独特的存储。这也与浏览器缓存分开,浏览器缓存是临时存储,以避免不必要地一遍又一遍地重新下载相同的文件。但是,用户通常还可以选择从浏览器中清除本地存储数据(选项可能称为“清除离线网站数据”)。桌面导出和移动应用程序等非浏览器导出选项不受用户从任何浏览器清除任意数量的数据影响,它们也使用单独的存储。最后,出于安全原因,浏览器对每个域使用单独的存储。例如,construct.net 上的所有内容共享相同的存储空间,但 facebook.com 上的内容使用不同的存储空间,并且无法访问从 construct.net 保存的任何数据。
脚本
使用 JavaScript 或 TypeScript 编码时,可以使用 IStorage 接口访问与 Construct 用于此对象相同的存储(本地存储插件本身没有专用的脚本接口)。此外,对于更高级的情况,您可以使用浏览器内置的存储 API(如 IndexedDB)。
存储配额
为了防止滥用,大多数浏览器都实现了存储配额,这是可以在本地保存的最大数据量。在大多数现代浏览器上,这被定义为设备上可用存储空间的一部分。您可以通过加载 Construct 并选中显示可用配额的 About 对话框来检查设备上的可用配额。如果超出配额,则在写入存储时将触发 On 错误触发器。
使用本地存储
本地存储使用一个非常简单的存储系统:值存储在命名键下,类似于 Dictionary 对象的工作方式。例如,值 100 可以存储在名为 score 的键下。
本地存储是异步的。这意味着读取和写入数据不会立即完成。这些操作仅启动读取或写入值的过程,并且项目在此期间继续运行。这可确保缓慢或繁忙的存储系统不会影响项目的性能。读取或写入完成后,将触发触发器(On item get 或 On item set),指示该值可供读取(使用 ItemValue 表达式)或该值已成功写入。
例如,下面是一个读取键“score”值的流程:
使用“获取项目”分数“操作
片刻之后,在项目“得分”上获得触发器
在此触发器中,使用 ItemValue 表达式读取项
以下是设置“score”新值的流程:
使用将项目“score”设置为 100 的操作
片刻之后,On item“score”设置触发器
您可能不需要在此触发器中执行任何操作,但它指示值已成功写入。Key 和 ItemValue 表达式仍在此触发器中设置,以备不时之需。
请注意,在使用异步存储时,必须小心避免“竞争”。例如,“清除存储”操作可能需要一段时间才能完成,然后才会触发“在存储已清除”中。可以在两者之间向存储写入更多值,而清除存储还在处理中。这就像“竞赛”清除存储和设置项目操作:最终结果取决于它们完成的顺序,这是不可预测的。在这种情况下,发生的事情或多或少是随机的:写入的密钥可能被清除,也可能不被清除 – 您不能依赖任何特定结果。因此,您应该小心避免这种情况。
使用 Dictionary 简化用法
尽管它提高了性能,但处理异步读取和写入有时可能很困难。方便地进行同步存储的一种简单方法是通过保存其 AsJSON 字符串,将整个 Dictionary 对象的内容存储到本地存储中。然后,您可以使用“加载”操作从本地存储加载此内容。这意味着只有保存和加载字典内容是异步的,其余时间您可以使用 Dictionary 对象的功能来同步访问数据,例如简单地使用其 Get 表达式立即读取值。但是,您必须记住在用户退出项目之前的某个时间点再次保存字典。
本地存储条件
在任何项目上获得
在任何“获取项目”操作完成后触发。
在删除的任何项目上
在任何“删除项目”操作完成后触发。
在任何项目集上
在任何设置项目操作完成后触发。
在项目存在时
如果选中的密钥确实存在,则在“检查项目存在”操作完成后触发。在此触发器中,ItemValue 表达式也设置为此键的值,因此无需使用另一个获取项操作来读取它。
注意:如果存储了二进制数据,则不设置 ItemValue。
在项目上获取
在给定键的“获取项目”操作完成后触发。ItemValue 表达式设置为键的值,读取二进制数据时除外。
在缺少的项目上
如果选中的密钥不存在,则在“检查项目存在”操作完成后触发。
在已删除的项目上
在给定键的“删除项”操作完成后触发。
在项目集上
在给定键的“设置项目”操作完成后触发。这表示数据现在已存储。
比较键
比较 Key 表达式的当前值,该表达式是触发器中当前键的名称。这在 On any item… 触发器中很有用。
比较价值
比较 ItemValue 表达式的当前值,该表达式在获取项时或在“项存在”中设置为项值。
持久性
如果浏览器已授予当前域持久存储权限,则为 True。有关详细信息,请参阅请求持久性存储操作。
在加载的所有键名称上
在“获取所有键名”操作完成后触发。在此触发器中,KeyCount 和 KeyAt 表达式提供所有键名称的列表。
出错时
在使用本地存储时,如果发生错误(例如写入失败或超出最大存储配额),则随时触发。如果可用,则将 ErrorMessage 表达式设置为错误消息。
在存储清除时
在“清除存储”操作完成且存储现在为空后触发。
正在处理得到
如果任何“获取项目”操作仍在处理中,则为 true,即“获取项目”操作尚未触发任何“On item get 触发器”。
是处理集
如果任何“设置项目”操作仍在处理中,即“设置项目”操作的任何“设置项目”触发器尚未触发,则为 True。
总而言之,完成
当所有未完成的 Get 项操作完成时触发,即 Is processing gets first 变为 false 时触发。换言之,如果同时使用 10 个 Get 项目操作,则当所有 10 个项目都已读取并触发其 On 项目获取触发器时,On all 将获得完整的触发器。
在所有套装上完成
当所有未完成的 Set 项操作完成时触发,即 Is first 处理集变为 false 时触发。换言之,如果同时使用了 10 个设置项操作,则当所有 10 个项目都已写入并触发其“设置项”触发器时,“所有设置”将完成触发器。
本地存储操作
检查项目是否存在
检查存储中是否存在密钥。如果键存在,这将触发 On 项存在,如果键不存在,则触发 On 项缺失。如果项存在,则 ItemValue 表达式将设置为“On 项存在”触发器中的键值,因此无需使用后续的“获取项”操作来读取该值。
注意:如果存储了二进制数据,则不设置 ItemValue。
获取项目
获取二进制项
读取存储中密钥的值。这将在读取值时触发 On item get。读取二进制数据时,数据将被写入所选的二进制数据对象;否则,ItemValue 表达式设置为键的值。
删除项目
从存储中移除(删除)密钥。删除密钥后,这将触发 On item removed。
设置项目
设置二进制项
在存储中设置密钥的值。这将在写入值时触发 On item set。设置二进制数据时,将写入二进制数据对象的内容;否则,将使用提供的文本或数字。
清仓
从存储中移除(删除)所有项目,将其恢复为空状态。这将触发“完成后清除存储”。
获取所有键名称
检索存储中当前存在的所有密钥名称的列表。这将触发加载列表时加载的所有键名,其中 KeyCount 和 KeyAt 表达式可用于访问列表。
请求持久性存储
请求使当前域的存储永久化。这通常仅适用于 Web 浏览器,因为所有其他导出选项都已使用持久性存储。在 Web 浏览器的上下文中,所有存储都以“尽力而为”的方式保留,但在各种情况下可能会被删除,例如使用过多的存储空间、长时间未访问站点等。如果授予持久存储权限,则浏览器将尽可能避免自动删除存储;即使用户在浏览器设置中选择清除存储,它也可以避免删除存储,除非他们明确确认要删除站点的数据。请求持久性存储可能会向用户显示一个可见的提示,要求他们接受权限,并且此操作仅允许在用户输入触发器(如鼠标单击或触摸)中使用。该操作是异步的,这意味着它可以与等待先前的操作一起完成,之后将授予或拒绝权限。“是持久性”条件反映当前的持久性权限状态。
本地存储表达式
项值
已在本地存储触发器中读取或写入的键的值,例如“On item get”或“On exists”。这可以是字符串或数字。如果在本地存储触发器之外使用,或者存储的是二进制数据而不是文本或数字,则返回 0。
钥匙
在任何本地存储触发器中修改的密钥的名称,例如“在项目获取”、“在项目集上”或“在任何项目集上”。如果在本地存储触发器之外使用,则返回空字符串。
错误消息
在“出错时”,错误消息的文本(如果有)可用。
KeyAt(索引)
在“加载的所有键名称”中,列表中给定索引处的键的名称。
键计数
在“加载的所有键名”中,列表中的键数。