You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java点击器游戏离线奖励系统实现方案技术问询

实现点击器游戏离线奖励的方案

嘿,这个需求在放置/点击类游戏里太常见了,核心逻辑就是记录应用离线前的时间,下次启动时计算时间差来发放奖励,不管你用Unity、Godot、网页技术还是原生开发,思路都是通用的,我给你拆解成具体步骤:

1. 记录应用离线时刻的时间戳

你需要在应用即将关闭、或者切换到后台(比如玩家切去看其他APP)的时候,把当前的UTC时间戳(以秒或毫秒为单位)存在本地持久化存储里。UTC时间能避免时区、夏令时带来的计算误差,这一点非常重要。

举几个不同平台的代码示例:

  • Unity(C#):
    // 在应用退出时调用
    void OnApplicationQuit()
    {
        // 获取当前UTC时间的秒数
        long currentUtcSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        // 存入Unity自带的本地存储
        PlayerPrefs.SetInt("LastOfflineTime", (int)currentUtcSeconds);
        PlayerPrefs.Save(); // 务必调用Save确保数据写入本地
    }
    
    // 别忘了处理应用切到后台的情况
    void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus) // 应用被暂停(切到后台)
        {
            long currentUtcSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            PlayerPrefs.SetInt("LastOfflineTime", (int)currentUtcSeconds);
            PlayerPrefs.Save();
        }
    }
    
  • 网页版(JavaScript):
    // 监听页面关闭事件
    window.addEventListener('beforeunload', () => {
        const currentUtcSeconds = Math.floor(Date.now() / 1000);
        localStorage.setItem('LastOfflineTime', currentUtcSeconds);
    });
    
    // 监听页面切换到后台(比如切标签页)
    document.addEventListener('visibilitychange', () => {
        if (document.hidden) {
            const currentUtcSeconds = Math.floor(Date.now() / 1000);
            localStorage.setItem('LastOfflineTime', currentUtcSeconds);
        }
    });
    

2. 应用启动时计算离线奖励

当玩家再次打开应用时,先读取之前存储的时间戳,再获取当前UTC时间戳,计算两者的差值就是离线的秒数。然后用这个秒数乘以money_persecond得到奖励。

同时建议加个最大离线时长限制(比如最多8小时),防止玩家故意离线几天刷海量奖励,破坏游戏平衡。

还是用Unity示例:

void Start()
{
    // 获取当前UTC时间秒数
    long currentUtcSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
    
    // 检查是否有存储过离线时间
    if (PlayerPrefs.HasKey("LastOfflineTime"))
    {
        long lastOfflineTime = PlayerPrefs.GetInt("LastOfflineTime");
        long offlineSeconds = currentUtcSeconds - lastOfflineTime;
        
        // 限制最大离线时长为8小时(28800秒)
        const long maxOfflineSeconds = 8 * 3600;
        offlineSeconds = Math.Min(offlineSeconds, maxOfflineSeconds);
        
        // 计算奖励
        long offlineReward = offlineSeconds * money_persecond;
        
        // 把奖励加到玩家金币里
        money += offlineReward;
        
        // 给玩家反馈,比如弹出提示
        Debug.Log($"欢迎回来!你离线期间获得了{offlineReward}枚硬币");
    }
    
    // 更新存储的时间为当前时间,为下一次离线做准备
    PlayerPrefs.SetInt("LastOfflineTime", (int)currentUtcSeconds);
    PlayerPrefs.Save();
}

3. 额外注意事项

  • 防作弊:单机游戏里玩家可能通过修改手机时间或本地存储文件刷奖励。如果要防这个,可以把时间戳加密后存储;如果是联网游戏,把离线时间的验证放在服务器端(服务器记录玩家最后在线时间,下次登录时由服务器计算奖励)。
  • 异常处理:如果读取本地存储失败(比如第一次打开应用,没有存储过时间),直接跳过奖励逻辑即可,不要让游戏崩溃。
  • 时间单位统一:全程用秒或者毫秒,不要混着用,避免计算错误。

内容的提问来源于stack exchange,提问作者Kamil Ciesielski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:54:04