麦田物语第十六天

发布于:2024-08-02 ⋅ 阅读:(39) ⋅ 点赞:(0)

系列文章目录

麦田物语第十六天



一、代码链接 UI 实现时间日期对应转换

本小节我们实现的是根据代码将UI和数据逻辑TimeManager联系起来。
首先我们创建Scripts->Time->UI->TimeUI脚本,接着就是脚本的编写了。
先引入Ui和DoTween插件的命名空间,然后声明变量,包括通过旋转切换早晨,中午,下午,晚上的图片,通过时间增加标识的图片父物体,季节的标识图片,还有显示日期和时间的Text,季节所要切换的图片数组,最后就是通过时间增加标识的图片子物体数组;(这里解释的不是很清楚)

TimeUI脚本的变量声明

public RectTransform dayNightImage;
    public RectTransform clockParent;
    public Image seasonImage;
    public Text dateText;
    public Text timeText;
    public Sprite[] seasonSprites;
    private List<GameObject> clockBlocks = new List<GameObject>();

然后返回Unity将该脚本拖拽到GameTime上并对这些变量进行赋值。

变量赋值结果如下

在这里插入图片描述
接下来我们还要在Awake方法中对clockBlocks 数组进行赋值,即将clockParent的所有子物体添加到数组中,并且将所有的子物体都SetActive(false)。
那么我们怎么实现UI跟随数据变化嘞?
我们需要在EventHandler脚本中声明两个新的事件(这个按照自己的方法,也可以每一个变量声明一个),然后在每次变量更新时呼叫这个事件即可(和之前事件的方法类似)。

EventHandler脚本中新声明的事件如下:

//和分钟变化有关的事件
    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> GameDateEvent;
    public static void CallGameDateEvent(int hour, int day, int month,int year, Season season)
    {
   
        GameDateEvent?.Invoke(hour, day, month, year, season);
    }

那么我们只需要在gameMinute改变时调用CallGameMinuteEvent即可,在GameHour改变时调用CallGameDateEvent即可;在此就不展示这两处代码。
接着我们需要返回TimeUI脚本中注册这些事件,编写OnEnable和OnDisable方法。

TimeUI脚本中的OnEnable和OnDisable方法如下:

private void OnEnable()
    {
   
        EventHandler.GameMinuteEvent += OnGameMinuteEvent;
        EventHandler.GameDateEvent += OnGameDateEvent;
    }

    private void OnDisable()
    {
   
        EventHandler.GameMinuteEvent