gpt4 book ai didi

c# - boolean 状态未能阻止功能重复

转载 作者:行者123 更新时间:2023-11-30 12:55:50 24 4
gpt4 key购买 nike

由于某种原因无法追踪到这一点,它应该很简单,但我遗漏了一些东西。在 PreCountdownTimer() 中,我从 GameManager.cs 获取两个 bool 属性,将它们分配给 _userActive_preCountdownActive 并且然后在 Update() 中查找更改。当 _userActive = false && _preCountdownActive = false 时,它启动 StartPreCountTimer() 并将 _preCountdownActive 设置为 true。

现在,一旦发生这种情况,Update() 将无法再根据要求调用 StartPreCountTimer()条件语句......但它仍然如此。这导致我的计时器在每一帧都被一遍又一遍地调用,从而阻止它倒计时。我在这里做错了什么阻止 _preCountdownActive boolean 停止 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;
}
}

最佳答案

我通过直接访问属性解决了这个问题,而不是将属性值保存到局部变量并访问局部变量。希望这是一种正确的方法?

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;
}
}
}

关于c# - boolean 状态未能阻止功能重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45245649/

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