由于某些原因无法跟踪此问题,它应该很简单,但我遗漏了一些东西.在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",_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; } }
解决方法
我通过直接访问属性而不是将属性值保存到局部变量并访问局部变量来解决了这个问题.希望这是一个正确的方法吗?
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; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。