gpt4 book ai didi

c# - 倒计时文本字段在倒计时期间未更新

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:46 25 4
gpt4 key购买 nike

我正在尝试为我的游戏创建一个不活动计时器,但似乎除了一个部分外,一切正常。预先计数后,我正在实例化一个预制计时器对话框,然后在我的协程中我试图更新位于该预制件中的文本字段“timerTextField”,但它没有更新。

我确实在“timerTextField.text = s.ToString();”之后在编辑器和我的 debug.log 中分配了所有适当的变量行正确倒计时。我有什么问题?

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
// Create Singleton
public static GameManager gameManagerInstance = null;

// Set Default Background Color
public Color defaultColor;

// Restart variables
private Vector3 prevMousePosition;

[SerializeField]
private Text timerTextField;

public Object startingScene;
public GameObject timeOutWarningDialog;
public float countdownLength;
public float countdownDelay;

private float seconds;
private Scene currentScene;
private GameObject gameManager;
private GameObject canvas;
private GameObject timerInstance;

void Awake()
{
if (gameManagerInstance == null)
gameManagerInstance = this;
else if (gameManagerInstance != null)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
gameManager = GameObject.FindGameObjectWithTag("GameManager");
}

void Start()
{
prevMousePosition = Input.mousePosition;
currentScene = SceneManager.GetActiveScene();
}

void Update()
{
if (Input.anyKeyDown || Input.mousePosition != prevMousePosition)
{
currentScene = SceneManager.GetActiveScene();

if (currentScene.name != startingScene.name)
{
StartPreCountTimer();
if (timeOutWarningDialog != null)
{
timeOutWarningDialog.SetActive(false);
}
}
}
prevMousePosition = Input.mousePosition;
}

// GAME TIMER

public void StartPreCountTimer()
{
// Debug.Log("Pre Count Started");
CancelInvoke();
if (GameObject.FindGameObjectWithTag("Timer") == null)
Invoke("ShowRestartWarning", countdownDelay);
}

void ShowRestartWarning()
{
canvas = GameObject.FindGameObjectWithTag("Canvas");
timerInstance = Instantiate(timeOutWarningDialog);
timerInstance.transform.SetParent(canvas.transform, false);
timerInstance.SetActive(true);

if (timerInstance.activeSelf == true)
StartTimer(countdownLength);
}

public void StartTimer(float seconds)
{
StartCoroutine("RunTimer", seconds);
}

IEnumerator RunTimer(float seconds)
{
float s = seconds;
// Debug.Log("Restart Countdown Started from: " + s);
while (s > 0)
{
if (timerTextField != null)
{
timerTextField.text = s.ToString();
Debug.Log(s);
}
yield return new WaitForSeconds(1);
s -= 1;
}

if (s == 0)
{
RestartGame();
}
}

void RestartGame()
{
SceneManager.LoadScene(startingScene.name);
// Debug.Log("Game Restarted");
}
}

最佳答案

您的问题来自 timerTextField 引用。

您似乎将位于预制件内的 Text 组件(我认为是 timeOutWarningDialog)分配给 Inspector 内的 timerTextField 字段。
因此,在实例化一个新的预制计时器对话框后,当您想要更改 timerTextField.text 值时,更改的是预制件中的 Text 组件,而不是实例化对象之一。

你检查这个但是选择你的预制件中包含 Text 组件的对象(在 Unity 的项目选项卡中):

Prefabs Text component value changing
(这也解释了您在开始时的奇怪值:停止游戏时达到的先前值)

要使您的脚本正常工作,您只需使用如下方式引用实例化预制件的新 Text 组件:

void ShowRestartWarning()
{
timerInstance = Instantiate(timeOutWarningDialog);
timerInstance.transform.SetParent(transform, false);
timerInstance.SetActive(true);
timerTextField = timerInstance.GetComponentInChildren<Text>(); // NEW LINE

if(timerInstance.activeSelf == true)
StartTimer(countdownLength);
}

希望这对您有所帮助,

关于c# - 倒计时文本字段在倒计时期间未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44532201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com