目录

U3D游戏开发框架七每日刷新

U3D游戏开发框架(七)——每日刷新

https://img-home.csdnimg.cn/images/20240715101418.png

关键词由CSDN通过智能技术生成

一:目的

任何一款游戏都需要一个每日刷新的机制,例如每日任务

所以我们需要一个管理器统一管理每日刷新的相关操作


二:解决的问题及优点

——自定义每日几点刷新


三:使用方法

——在游戏启动的最开始创建DailyMgr实例: _ = DailyMgr.Ins

——设置常量refreshHour

——使用自己的存档管理器管理存档数据,替换获取存档和保存存档的逻辑语句:

int lastDayOfYear = PlayerPrefs.GetInt(“lastDayOfYear”, -1)

PlayerPrefs.SetInt(“lastDayOfYear”, now.DayOfYear)


四:代码实现

using System;
using UnityEngine;

/// <summary>
/// 每日刷新管理器
/// </summary>
public class DailyMgr : MonoSingleton<DailyMgr>
{
    public const int RefreshHour = 5;//几点刷新

    public override void Awake()
    {
        base.Awake();

        CheckRefresh();

        lastCheckTime = Time.realtimeSinceStartup;
    }

    private void OnApplicationPause(bool pause)
    {
        if (!pause)
        {
            CheckRefresh();
        }
    }

    float lastCheckTime;//上一次检测的时间
    private void Update()
    {
        //5秒检测一次
        if (Time.realtimeSinceStartup - lastCheckTime > 5)
        {
            lastCheckTime = Time.realtimeSinceStartup;
            CheckRefresh();
        }
    }

    /// <summary>
    /// 检测刷新
    /// </summary>
    void CheckRefresh()
    {
        DateTime now = DateTime.Now;
        int lastDayOfYear = PlayerPrefs.GetInt("lastDayOfYear", -1);
        if (now.DayOfYear != lastDayOfYear)
        {
            //同一年
            if (now.DayOfYear > lastDayOfYear)
            {
                //超过一天未登陆
                if (now.DayOfYear - lastDayOfYear >= 2)
                {
                    PlayerPrefs.SetInt("lastDayOfYear", now.DayOfYear);
                    RefreshData();
                }
                //只有一天未登陆
                else
                {
                    if (now.Hour >= RefreshHour)
                    {
                        PlayerPrefs.SetInt("lastDayOfYear", now.DayOfYear);
                        RefreshData();
                    }
                }
            }
            //跨年
            else if (now.DayOfYear < lastDayOfYear)
            {
                int lastYear = now.Year - 1;
                int lastYearTotalDays = lastYear % 4 == 0 ? 366 : 365;
                //超过一天未登陆
                if (lastYearTotalDays + now.DayOfYear - lastDayOfYear >= 2)
                {
                    PlayerPrefs.SetInt("lastDayOfYear", now.DayOfYear);
                    RefreshData();
                }
                //一天未登陆并且到达刷新时间
                else
                {
                    if (now.Hour >= RefreshHour)
                    {
                        PlayerPrefs.SetInt("lastDayOfYear", now.DayOfYear);
                        RefreshData();
                    }
                }
            }
        }
    }

    /// <summary>
    /// 刷新(所有需要每日刷新的数据)
    /// </summary>
    public void RefreshData()
    {

    }
}