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

Unity3D仿星露谷物语开发25之创建时钟界面

1、目标

在时钟界面显示当前时钟信息,同时设置特殊按钮可以快速推进时间用于测试。

2、创建GameClock.cs脚本

在Assets -> Scripts -> TimeSystem目录下创建GameClock.cs脚本。

代码如下:

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class GameClock : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI timeText = null;
    [SerializeField] private TextMeshProUGUI dateText = null;
    [SerializeField] private TextMeshProUGUI seasonText = null;
    [SerializeField] private TextMeshProUGUI yearText = null;

    private void OnEnable()
    {
        EventHandler.AdvanceGameMinuteEvent += UpdateGameTime;
    }

    private void UpdateGameTime(int gameYear, Season gameSeason, int gameDay, string gameDayOfWeek, int gameHour, int gameMinute, int gameSecond)
    {
        // Update time
        gameMinute = gameMinute - (gameMinute % 10); // 10的倍数显示

        string ampm = "";
        string minute;

        if(gameHour >= 12)
        {
            ampm = " pm";
        }
        else
        {
            ampm = " am";
        }

        if(gameHour >= 13)
        {
            gameHour -= 12;
        }

        if(gameMinute < 10)
        {
            minute = "0" + gameMinute.ToString();
        }
        else
        {
            minute = gameMinute.ToString();
        }

        string time = gameHour.ToString() + ":" + minute + ampm;

        timeText.SetText(time);
        dateText.SetText(gameDayOfWeek + ". " + gameDay.ToString());
        seasonText.SetText(gameSeason.ToString());
        yearText.SetText("Year " + gameYear);

    }
}

3、优化TimeManager.cs脚本

作用:触发时间加速

添加如下代码:

/// <summary>
/// Advance 1 game minute
/// </summary>
public void TestAdvanceGameMinute()
{
    for(int i = 0; i < 60; i++)
    {
        UpdateGameSecond();
    }
}

/// <summary>
/// Advance 1 day
/// </summary>
public void TestAdvanceGameDay()
{
    for(int i = 0; i < 86400; i++)
    {
        UpdateGameSecond();
    }
}

同时在UpdateGameSecond函数中添加:

4、优化Player.cs脚本

增加特定按钮触发加速时间的逻辑。

添加如下方法:

/// <summary>
/// Temp routine for test input
/// </summary>
private void PlayerTestInput()
{
    // Trigger Advance Time
    if (Input.GetKey(KeyCode.T))
    {
        TimeManager.Instance.TestAdvanceGameMinute();
    }

    // Trigger Advance Day
    if (Input.GetKey(KeyCode.G))
    {
        TimeManager.Instance.TestAdvanceGameDay();
    }
}

然后在Update()中添加该方法:

5、创建时钟UI

(1)添加GameClock物体

在Hierarchy -> PersistentScene -> UI -> MainGameUICanvas -> UICanvasGroup下创建空物体命名为GameClock。

该对象添加Image组件。

(2)设置GameClock定位到右上角

按住Shift键,然后点击右上角。

修改PosX和PosY的值为-4和-2.5。

(3)添加Text组件

在GameClock下添加空物体命名为Year,然后该对象添加TextMeshPro - Text(UI)组件,具体配置如下:

复制Year得到另外三个对象分别为Season、Date Text、Date Time如下图所示:

然后给GameClock对象添加GameClock组件,配置对应的信息如下:

运行程序,显示如下:

当按下T键后,分的时间会加速,当按下G后,天的时间会加速。


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

相关文章:

  • 图漾相机搭配VisionPro使用简易教程
  • 第二十一周:Mask R-CNN
  • Mono里运行C#脚本36—加载C#类定义的成员变量和方法的数量
  • 《CPython Internals》阅读笔记:p360-p377
  • Qt监控系统辅屏预览/可以同时打开4个屏幕预览/支持5x64通道预览/onvif和rtsp接入/性能好
  • SpringBoot基础概念介绍-数据源与数据库连接池
  • 【Rust自学】14.6. 安装二进制crate
  • 「 机器人 」利用数据驱动模型替代仿真器:加速策略训练并降低硬件依赖
  • CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇
  • 青少年CTF练习平台 PHP的XXE
  • 【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述(一)
  • vulnhub 靶场 —— MrRobot
  • 星火大模型接入及文本生成HTTP流式、非流式接口(JAVA)
  • 【深度学习基础】多层感知机 | 数值稳定性和模型初始化
  • 软件开发学习路线——roadmap
  • java.io包中StringWriter类和PrintWriter类作用
  • 上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投
  • rust学习-rust中的保留字
  • python编写Socket程序
  • vue3表格数据分2个表格序号连续展示
  • 基于亿坊PHP框架构建物联网解决方案的优势分析!
  • 【QT】- QThread类介绍和线程的创建
  • 「 机器人 」扑翼飞行器的数据驱动建模核心方法
  • Django基础之ORM
  • arm-linux平台、rk3288 SDL移植
  • (算法竞赛)使用广度优先搜索(BFS)解决迷宫最短路径问题