由于某种原因无法跟踪此问题,它应该很简单,但我遗漏了一些东西。在PreCountdownTimer()
我从GameManager.cs
获得两个bool属性,将它们分配给_userActive
和_preCountdownActive
,然后在 Update()
。当_userActive = false && _preCountdownActive = false
启动 StartPreCountTimer()
并将_preCountdownActive
设置为true时。
现在一旦发生这种情况, Update()
就不再能够根据条件声明调用 StartPreCountTimer()
...但它仍然可以。这导致我的计时器一遍又一遍地被调用,从而阻止它能够倒计时。这里有什么错误阻止_preCountdownActive
bool阻止 Update
解雇 StartPreCountTimer()
?
PreCountdownTimer.cs
using System.Collections;
using UnityEngine;
public class PreCountdownTimer : MonoBehaviour {
public bool ShowRestartDialog { get; set; }
private IEnumerator counter;
private bool _startPrecount;
private float _preCountdownInterval;
private bool _preCountdownActive = false;
private bool _userActive = false;
private float _timerLength;
void Start()
{
_timerLength = GameManager.Instance.PreCountdownLength;
}
void Update()
{
_userActive = GameManager.Instance.UserActive;
if (!_userActive && !_preCountdownActive)
StartPreCountTimer(_timerLength);
else if (_userActive && _preCountdownActive)
StopPreCountTimer();
Debug.Log("The state of preCountdownActive is: " + _preCountdownActive);
}
void StartPreCountTimer(float length)
{
_preCountdownActive = true;
counter = RunTimer(length);
StartCoroutine(counter);
}
void StopPreCountTimer()
{
_preCountdownActive = false;
StopCoroutine(counter);
}
IEnumerator RunTimer(float seconds)
{
float s = seconds;
while (s > 0)
{
yield return new WaitForSeconds(_preCountdownInterval);
s -= _preCountdownInterval;
Debug.Log("PreCount: " + s);
}
if (s == 0)
{
_preCountdownActive = false;
ShowRestartDialog = true;
}
}
}
GameManager.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager Instance = null; // create singleton
public Object introScene;
public bool UserActive { get; set; }
public bool OnIntroScreen { get; set; }
public GameObject preCountdownTimerPrefab;
private GameObject _preCountdownTimerInstance;
public float PreCountdownLength { get; protected set; }
public float PreCountdownInterval { get; protected set; }
private float _checkMousePositionTimingInterval = 1.0f;
private Vector3 _currentMousePosition;
private Vector3 _prevMousePosition;
private Scene _currentScene;
void Awake()
{
if (Instance == null)
Instance = this;
else if (Instance != null)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
}
void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
_currentScene = scene;
}
void Start()
{
PreCountdownLength = 5.0f;
PreCountdownInterval = 1.0f;
OnIntroScreen = true;
UserActive = false;
_prevMousePosition = Input.mousePosition;
InvokeRepeating("LastMousePosition", 0, _checkMousePositionTimingInterval);
}
void Update()
{
_currentMousePosition = Input.mousePosition;
if (_currentScene.name != introScene.name)
{
OnIntroScreen = false;
if (_currentMousePosition != _prevMousePosition)
UserActive = true;
else
UserActive = false;
}
else if (_currentScene.name == introScene.name)
OnIntroScreen = true;
if (!UserActive && !OnIntroScreen)
if (_preCountdownTimerInstance == null)
_preCountdownTimerInstance = Instantiate(preCountdownTimerPrefab);
else if (UserActive)
if (_preCountdownTimerInstance != null)
Destroy(_preCountdownTimerInstance);
}
void LastMousePosition()
{
_prevMousePosition = Input.mousePosition;
}
}
答案 0 :(得分:0)
我通过直接访问属性而不是将属性值保存到局部变量并访问局部变量来解决了这个问题。希望这是一个正确的方法吗?
using System.Collections;
using UnityEngine;
public class PreCountdownTimer : MonoBehaviour {
private IEnumerator counter;
void Update()
{
if (!GameManager.Instance.UserActive && !GameManager.Instance.PreCountdownActive)
StartPreCountTimer(GameManager.Instance.PreCountdownLength);
else if (GameManager.Instance.UserActive && GameManager.Instance.PreCountdownActive)
StopPreCountTimer();
}
void StartPreCountTimer(float length)
{
GameManager.Instance.PreCountdownActive = true;
counter = RunTimer(length);
StartCoroutine(counter);
}
void StopPreCountTimer()
{
GameManager.Instance.PreCountdownActive = false;
StopCoroutine(counter);
}
IEnumerator RunTimer(float seconds)
{
float s = seconds;
while (s > 0)
{
yield return new WaitForSeconds(GameManager.Instance.PreCountdownInterval);
s -= GameManager.Instance.PreCountdownInterval;
Debug.Log("PreCount: " + s);
}
if (s == 0)
{
GameManager.Instance.PreCountdownActive = false;
}
}
}