添加倒计时

This commit is contained in:
huqibin 2025-02-27 11:09:04 +08:00
parent 459da470c9
commit 3040218c5a
4 changed files with 139 additions and 1 deletions

View File

@ -0,0 +1,101 @@
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using TMPro;
public class Timers : MonoBehaviour
{
private bool isRun = false;
public float limitTime = 0;
private TextMeshProUGUI guiTimer;
public UnityAction<string> timeOver;
public void SetTime(int _time, TextMeshProUGUI timeText, UnityAction<string> timeOverCallback)
{
limitTime = _time * 60;
guiTimer = timeText;
guiTimer.text = "倒计时:" + StringHelper.GetCountDownStr((int)limitTime);
timeOver = timeOverCallback;
RunTimer();
}
public string GetCurrentTime()
{
EndTimer();
return limitTime.ToString("0");
}
// 运行计时器
public void RunTimer()
{
isRun = true;
}
// 暂停或恢复计时器
public void PauseTimer()
{
isRun = false;
}
// 结束计时器
public void EndTimer()
{
isRun = false;
}
// Update 方法在每一帧运行,用于更新计时器的状态和显示
private void Update()
{
if (isRun)
Timer();
}
/// <summary>
/// 计时
/// </summary>
/// <returns></returns>
private void Timer()
{
guiTimer.text = StringHelper.GetCountDownStr((int)limitTime);
if (limitTime >= 0)
{
limitTime -= Time.deltaTime;
guiTimer.text = "倒计时:" + StringHelper.GetCountDownStr((int)limitTime);
}
else
{
//Debug.Log("计时结束");
limitTime = 0;
guiTimer.text = "倒计时:" + StringHelper.GetCountDownStr((int)limitTime);
timeOver?.Invoke(limitTime.ToString());
isRun = false;
}
}
}
public class StringHelper
{
public const string format = "{0}:{1}:{2}";
public const char zero = '0';
public const int hour2Second = 3600;
public const int minute2Second = 60;
/// <summary>
/// 倒计时格式
/// </summary>
/// <param name="second">秒数</param>
/// <returns></returns>
public static string GetCountDownStr(int second)
{
int hours = second / 3600;
int minutes = (second % 3600) / 60;
int seconds = second % 60;
return string.Format("{0:00}:{1:00}:{2:00}", hours, minutes, seconds);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 18387162de4e32c4d9463506cca9a9d8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 912765198}
- component: {fileID: 912765200}
- component: {fileID: 912765199}
- component: {fileID: 7427894153927231783}
m_Layer: 5
m_Name: modelText (TMP)
m_TagString: Untagged
@ -135,6 +136,19 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &7427894153927231783
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 912765197}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18387162de4e32c4d9463506cca9a9d8, type: 3}
m_Name:
m_EditorClassIdentifier:
limitTime: 0
--- !u!1 &1209595290
GameObject:
m_ObjectHideFlags: 0
@ -1073,6 +1087,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f086b9c0b118c40418934216517cd57c, type: 3}
m_Name:
m_EditorClassIdentifier:
modelText: {fileID: 912765199}
timer: {fileID: 7427894153927231783}
--- !u!1 &4884683979387215420
GameObject:
m_ObjectHideFlags: 0

View File

@ -14,6 +14,8 @@ public class UI_MainTitlePanel : BasePanel
//public GameObject timeInfo;
//public GameObject modelInfo;
//public GameObject useNameInfo;
public TextMeshProUGUI modelText;
public Timers timer;
internal void Init()
{
SwitchTitleImg();
@ -66,7 +68,8 @@ public class UI_MainTitlePanel : BasePanel
GetControl<Image>("modelText").gameObject.SetActive(mode != "");
//GetControl<Image>("userName").gameObject.SetActive(mode != string.Empty && mode != "学习模式");
///模式显示text
GetControl<TextMeshProUGUI>("modelText (TMP)").text = mode;
modelText.text = mode;
}
private void InitializationUI()
@ -74,6 +77,13 @@ public class UI_MainTitlePanel : BasePanel
GetControl<Button>("upExamBtn").gameObject.SetActive(RunModelMgr.Instance.ModeType == E_ModeType.Exam);
GetControl<Button>("submitBtn").gameObject.SetActive(RunModelMgr.Instance.ModeType == E_ModeType.Practice);
//GetControl<Image>("timeText").gameObject.SetActive(RunModelMgr.Instance.ModeType == E_ModeType.Exam);
if (GameManager.RunModelMgr.ModeType == E_ModeType.Exam)
{
timer.SetTime(GameManager.NetMgr.totalTime, modelText, (s) =>
{
GameManager.EventMgr.EventTrigger(Enum_EventType.Submit);
});
}
}
public void ResetByModeType()