游戏天文日时钟

作者:追风剑情 发布于:2022-6-30 12:17 分类:Unity3d

模拟游戏中一天的时间

using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 模拟时钟(游戏中的天文日)
/// </summary>
public class AstronomicaldayClock : MonoBehaviour
{
    //游戏中的一天多少秒
    [SerializeField]
    private int secondPerDay = 1200;
    //当天已过去了多少秒
    private int elapsedSecond;
    [SerializeField]
    private bool m_AwakePlay;
    //闹钟字典
    private Dictionary<int, Action<int>> alarmClockDic = new Dictionary<int, Action<int>>();

    public int Elapsed
    {
        get { return elapsedSecond; }
        set {
            elapsedSecond = value;
            if (alarmClockDic.ContainsKey(elapsedSecond))
                alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
        }
    }

    private void Awake()
    {
        if (m_AwakePlay)
            ResetClock();
    }

    // 注册闹钟
    public void RegisterAlerm(int second, Action<int> callback)
    {
        if (alarmClockDic.ContainsKey(second))
            return;
        alarmClockDic[second] = callback;
    }

    // 注销闹钟
    public void UnregisterAlerm(int second)
    {
        if (!alarmClockDic.ContainsKey(second))
            return;
        alarmClockDic.Remove(second);
    }

    // 重置时钟
    public void ResetClock()
    {
        elapsedSecond = 0;
        CancelInvoke("OnTimer");
        InvokeRepeating("OnTimer", 1, 1);
    }

    private void OnTimer()
    {
        elapsedSecond = (elapsedSecond + 1) % secondPerDay;
        if (alarmClockDic.ContainsKey(elapsedSecond))
            alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
    }

    private void OnDestroy()
    {
        CancelInvoke();
        alarmClockDic.Clear();
    }
}

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号