口袋方舟开发日记 | 如何才能较为稳妥地拿到玩家的存档呢?

我们在读取存档的时候,可能会遇到两种情况:

  • 玩家是第一次玩我们的游戏,本身存档为空
  • 玩家在游戏本来存在存档,但是由于读取的时候出现错误,导致读取的存档同样为空


以上两种情况读到的数据都为初始化的值,那么如何才能较为稳妥地拿到玩家的存档呢?
 


具体思路如下:

第一步,判断获取成功状态
我们可以根据获取的 DataStorageResult 的code值,判断此次获取是否成功,代码如下:

<span style="color:#494b4d"><span style="background-color:#ffffff"><span style="background-color:#272822"><span style="color:#f8f8f2"><code class="language-typescript">
<span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>SystemUtil<span style="color:#f8f8f2">.</span><span style="color:#e6db74">isServer</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
    DataStorage<span style="color:#f8f8f2">.</span><span style="color:#e6db74">asyncGetData</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"dataKey"</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">then</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
        <span style="color:#8292a2">//需要判断数据储存获取情况为Success,并且保险起见,判断一下获取的data不为null</span>
        <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Success <span style="color:#f8f8f2">&&</span> result<span style="color:#f8f8f2">.</span>data <span style="color:#f8f8f2">!=</span> <span style="color:#66d9ef">null</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
            <span style="color:#8292a2">//此时可确保result.data正常获取</span>
            <span style="color:#66d9ef">let</span> data <span style="color:#f8f8f2">=</span> result<span style="color:#f8f8f2">.</span>data
        <span style="color:#f8f8f2">}</span>
    <span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">}</span>
</code></span></span></span></span>
TypeScript
复制


第二步,判断获取失败的原因,并且尝试再次获取
接下来需要用code值判断获取失败的原因,并且分情况进行重新获取存档,代码如下:
 

<span style="color:#494b4d"><span style="background-color:#ffffff"><span style="background-color:#272822"><span style="color:#f8f8f2"><code class="language-typescript"><span style="color:#66d9ef">private</span> <span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
    <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>SystemUtil<span style="color:#f8f8f2">.</span><span style="color:#e6db74">isServer</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
        DataStorage<span style="color:#f8f8f2">.</span><span style="color:#e6db74">asyncGetData</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"dataKey"</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">then</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
            <span style="color:#8292a2">//需要判断数据储存获取情况为Success,并且保险起见,判断一下获取的data不为null</span>
            <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Success <span style="color:#f8f8f2">&&</span> result<span style="color:#f8f8f2">.</span>data <span style="color:#f8f8f2">!=</span> <span style="color:#66d9ef">null</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
                <span style="color:#8292a2">//此时可确保result.data正常获取</span>
                <span style="color:#66d9ef">let</span> data <span style="color:#f8f8f2">=</span> result<span style="color:#f8f8f2">.</span>data
            <span style="color:#f8f8f2">}</span>
            <span style="color:#8292a2">//若获取情况为请求超时或未知错误,可以直接再次发送拿数据的请求</span>
            <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>TimeOut <span style="color:#f8f8f2">||</span> result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>Failure<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
                <span style="color:#66d9ef">this</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
            <span style="color:#f8f8f2">}</span>
            <span style="color:#8292a2">//若获取情况为请求频率过高,需要等待一段时间再次发送拿数据请求</span>
            <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> <span style="color:#f8f8f2">(</span>result<span style="color:#f8f8f2">.</span>code <span style="color:#f8f8f2">===</span> DataStorageResultCode<span style="color:#f8f8f2">.</span>RequestTooFrequent<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
                <span style="color:#e6db74">setTimeout</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">=></span> <span style="color:#f8f8f2">{</span>
                    <span style="color:#66d9ef">this</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getData</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span>
                <span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span> <span style="color:#ae81ff">5000</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
            <span style="color:#f8f8f2">}</span>
            <span style="color:#66d9ef">else</span> <span style="color:#f8f8f2">{</span>
                <span style="color:#a6e22e">console</span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">log</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">"获取错误请检查代码逻辑,错误码"</span> <span style="color:#f8f8f2">+</span> result<span style="color:#f8f8f2">.</span>code<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>

            <span style="color:#f8f8f2">}</span>
        <span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">)</span>
    <span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
</code></span></span></span></span>
TypeScript
复制


这样就可以保证有存档的玩家当出现拿取存档错误的时候无法进入游戏,而不是造成存档毁坏啦

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值