系列文章目录
麦田物语第十六天
一、代码链接 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