加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – bool状态无法阻止函数重复

发布时间:2020-12-15 21:07:20 所属栏目:百科 来源:网络整理
导读:由于某些原因无法跟踪此问题,它应该很简单,但我遗漏了一些东西.在PreCountdownTimer()中,我从GameManager.cs获取两个bool属性,将它们分配给_userActive和_preCountdownActive,然后在Update()中查找更改.当_userActive = false _preCountdownActive = false它
由于某些原因无法跟踪此问题,它应该很简单,但我遗漏了一些东西.在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;
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读