当前位置: 首页 > article >正文

麦田物语学习笔记:代码链接UI实现时间日期对应转换

基本流程

        时间系统UI如下

本篇文章将UI和TimeManager里的数据联系在一起,

1.代码思路 

        (1)新建TimeUI.cs挂载在GameTime物体上,然后获取它的子物体这些组件来改变里面的数值,所以需要获得Day & Night的子物体Image中的Rect Transform,用于旋转季节的图标;获得Clock每个子物体的显示;以及日期,时间,季节的图片的显示

 图中围绕季节一周的是时间的区块显示,每4个小时会增加一格

        (2)像日夜交换,时间的区块显示,季节变换,日期显示都和小时有关;只有具体时间的文本显示与秒有关,所以需要创建两个事件,这两个事件帮助我们呼叫,告诉UI切换数据.然后在TimeManager相应位置呼叫事件,最后在TimeUI当中注册这些事件

这里当然可以只用一个事件,但是由于与秒相关的事件调用频繁,所以考虑到性能开销,这里用了两个事件呼叫

         (3)需要注意的是,要将时间更新的代码在一开始就执行

2.代码实现

新增TimeManager中的代码

private void Start()
{
    EventHandler.CallGameDataEvent(gameHour, gameDay, gameMonth, gameYear, gameSeason);
    EventHandler.CallGameMinuteEvent(gameMinute, gameHour);
}

private void UpdateGameTime()
{
    gameSecond++;
    if (gameSecond > Settings.secondHold)
    {
        gameMinute++;
        gameSecond = 0;

        if (gameMinute > Settings.minuteHold)
        {
            gameHour++;
            gameMinute = 0;

            if (gameHour > Settings.hourHold)
            {
                gameDay++;
                gameHour = 0;

                if (gameDay > Settings.dayHold)
                {
                    gameMonth++;
                    gameDay = 1;

                    if (gameMonth > 12)
                    {
                        gameMonth = 1;
                    }

                    monthInSeason--;

                    if (monthInSeason == 0)
                    {
                        monthInSeason = 3;

                        int seasonNumber = (int)gameSeason;
                        seasonNumber++;

                        if (seasonNumber > Settings.seasonHold)
                        {
                            gameYear++;
                            seasonNumber = 0;
                        }
                        gameSeason = (Season)seasonNumber;

                        if (gameYear > 9999)
                        {
                            gameYear = 2025;
                        }
                    }
                }
            }
            EventHandler.CallGameDataEvent(gameHour, gameDay, gameMonth, gameYear, gameSeason);
        }
        EventHandler.CallGameMinuteEvent(gameMinute, gameHour);
    }

    //Debug.Log("Second: " + gameSecond + "Minte: " + gameMinute);
}

新增两个事件

//跟分钟相关
public static event Action<int, int> GameMinuteEvent;
public static void CallGameMinuteEvent(int minute,int hour)
{
    GameMinuteEvent?.Invoke(minute,hour);
}

//跟日期相关
public static event Action<int,int,int,int,Season> GameDataEvent;
public static void CallGameDataEvent(int hour,int day,int month,int year,Season season)
{
    GameDataEvent?.Invoke(hour,day,month,year,season);
}

 TimeUI.cs

public class TimeUI : MonoBehaviour
{
    public RectTransform dayNightImage;

    public RectTransform clockParent;

    public TextMeshProUGUI dataText;

    public TextMeshProUGUI timeText;

    public Image seasonImage;

    public Sprite[] seasonSprites;//获取四个季节的图片

    public List<GameObject> clockBlocks = new List<GameObject>();//获取代表时间的各个物体

    private void Awake()
    {
        for (int i = 0;i < clockParent.childCount;i++)
        {
            clockBlocks.Add(clockParent.GetChild(i).gameObject);
            clockParent.GetChild(i).gameObject.SetActive(false);
        }
    }

    private void OnEnable()
    {
        EventHandler.GameMinuteEvent += OnGameMinuteEvent;
        EventHandler.GameDataEvent += OnGameDataEvent;
    }

    private void OnDisable()
    {
        EventHandler.GameMinuteEvent -= OnGameMinuteEvent;
        EventHandler.GameDataEvent -= OnGameDataEvent;
    }

    private void OnGameMinuteEvent(int minute, int hour)
    {
        //TimeText有关的
        timeText.text = hour.ToString("00") + ":" + minute.ToString("00"); //这里的"00"是用来规定格式的,不是赋值
    }

    private void OnGameDataEvent(int hour, int day, int month, int year, Season season)
    {
        //日期相关
        dataText.text = year + "年" + month.ToString("00") + "月" + day.ToString() + "日";

        seasonImage.sprite = seasonSprites[(int)season];

        SwitchHourImage(hour);
        DayNightImageRotate(hour);
    }

    /// <summary>
    /// 根据时间显示区块
    /// </summary>
    /// <param name="hour"></param>
    private void SwitchHourImage(int hour)
    {
        int index = hour / 4;

        //先考虑0的情况:把所有时间块全部关闭
        if (index == 0)
        {
            foreach (var item in clockBlocks)
            {
                item.SetActive(false);
            }
        }
        else 
        {
            for (int i = 0; i < clockBlocks.Count;i++)
            { 
                if(i < index + 1)
                    clockBlocks[i].SetActive(true);
                else
                    clockBlocks[i].SetActive(false);
            }
        }
    }

    private void DayNightImageRotate(int hour)
    {
        var target = new Vector3(0,0,hour * 15 - 90);
        dayNightImage.DORotate(target, 1f, RotateMode.Fast);
    }
}

最终效果

根据时间旋转相应的图片显示以及区块显示

 0点时清空区块

 补充知识点

1.DoTween

        DOTween是一个动画插件,可以了解一下


http://www.kler.cn/a/506126.html

相关文章:

  • [SAP ABAP] 批量导入(BDC)练习案例
  • 《自动驾驶与机器人中的SLAM技术》ch4:预积分学
  • 网络安全 | 什么是威胁情报?
  • 嵌入式系统Linux实时化(四)Xenomai应用开发测试
  • 我的年度总结
  • ASP.NET Core - 缓存之分布式缓存
  • 计算机组成原理复习笔记
  • 在 QNAP NAS中使用 Container Station 运行 Docker 的完整指南
  • 软件测试 —— Selenium(弹窗)
  • Dart语言的文件操作
  • 疾病防控综合系统设计与实现(代码+数据库+LW)
  • 构建高效安全的数据库异地备份方案
  • 计算机三级网络技术 大题(学习笔记)
  • 使用el-tree根据切割规则切割数据生成树形结构
  • Python猜数小游戏
  • idea上git log面板的使用
  • openharmony标准系统方案之瑞芯微RK3568移植案例
  • 用ChatGPT进行酒店评论情感分析
  • HTTP:TIME_WAIT累积与端口耗尽
  • delphi 调用 c++Dll 函数获取纯真ip地址
  • 浅谈云计算15 | 存储可靠性技术(RAID)
  • 如何在谷歌浏览器中设置自定义安全警告
  • k8s 集群组件
  • android 主题都表示什么意思
  • 怎么防止SQL注入攻击
  • Uniapp-运行到手机安卓基座报错