Unity 2D C# 重新加载进度条无法正常工作

Unity2D C# Reloading progress bar not working propertly

所以我正在制作一款自上而下的坦克射击游戏,我想制作一个比以前更好的装填系统。所以我想到我需要一些进度条之王。我知道怎么做,所以我开始做。问题是它不能正常工作。正如我在上面的 .gif 中所示,第二次拍摄时进度条不会下降。因为我是unity的新手,所以我还不是很了解。所以我来到这里,也许有人可以提供帮助。

编辑: 我刚刚发现了另一个问题,也许是我遇到这个问题的答案。我的脚本第二次尝试重新加载时,我的 "needTimer" bool 为 false,因此当它为 false 时进度条不会下降。新的问题是为什么它变成假而不是真的? 我的重新加载脚本:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Reload : MonoBehaviour {

    public float ammo;
    public Image progress;
    public bool alreadyReloading;
    public bool needTimer;

    void Start () {
        alreadyReloading = false;
    }
    IEnumerator needtimertime(){
        yield return new WaitForSeconds (6.5f);
        needTimer = false;
    }
    IEnumerator uztaisyt(){
        Debug.Log ("REEELOUUUDING!");
        yield return new WaitForSeconds(6.5f);
        ammo += 1;
        alreadyReloading = false;
    }

    void Update () {
        if (needTimer == true) {
            timer ("");
        }
        if (ammo < 5) {
            if(alreadyReloading == false){
                needTimer = true;
                StartCoroutine(uztaisyt());
                alreadyReloading = true;
            }
        }
        if (progress.fillAmount <= 0) {
            progress.fillAmount = 1.0f; 
        }
    }

    void timer(string tipas){
        progress.fillAmount -=  Time.deltaTime / 6.5f;
        StartCoroutine (needtimertime ());
    }
}

当您在第一次拍摄后(在动画中)将 uztaisyt() 作为协程启动时,needTimer 设置为true 并且在 next Update() 调用中,needtimertime() 协程将启动。由于 uztaisyt()needtimertime() 都有相同的 6.5 秒等待时间,因此它们 而不是 return 在同一帧更新,因为 needtimertime() 将始终在 uztaisyt() 之后的下一帧开始。并且,由于无法保证 Update() 调用之间的时间间隔,(参见 Time and Frame Managment),此间隔可能超过预期并且 needtimertime ()uztaisyt() 之后的帧中 return 可能会在第二次触发后调用 false。

确保 needtimertime() 始终在调用 uztaisyt()[= 后立即启动(如果尚未 运行) 31=](并在同一帧更新中调用),您可以尝试对重新加载脚本进行以下更新,(基本上更改了 Update() 方法并设置了 when/how _isTimerRunning)。

public class Reload : MonoBehaviour {

  public float ammo;
  public Image progress;

  private bool _alreadyReloading;
  private bool _isTimerRunning;

  void Start () {
      _alreadyReloading = false;
      _isTimerRunning = false;
  }

  IEnumerator needtimertime(){
      yield return new WaitForSeconds (6.5f);
      _needTimer = false;
  }

  IEnumerator uztaisyt(){
      Debug.Log ("REEELOUUUDING!");
      yield return new WaitForSeconds(6.5f);
      ammo += 1;
      _alreadyReloading = false;
  }

  void Update () {
      if (ammo < 5) {
          if(_alreadyReloading == false){                                        
              StartCoroutine(uztaisyt());
              _alreadyReloading = true;

              //this will check for and start the progress bar timer in the same udate call
              //so both coroutines finish on the same frame update
              if(!_isTimerRunning){
                _isTimerRunning = true;
                timer ("");
              }
          }
      }
      if (progress.fillAmount <= 0) {
          progress.fillAmount = 1.0f; 
      }
  }

  void timer(string tipas){
      progress.fillAmount -=  Time.deltaTime / 6.5f;
      StartCoroutine (needtimertime ());
  }
}

我发现了我的问题并解决了它。 问题是 needTimer 变得错误了。所以我找到了它并删除了它。

我的新密码:

using UnityEngine;

使用UnityEngine.UI; 使用 System.Collections;

public class 重新加载:MonoBehaviour {

public float ammo;
public Image progress;
public bool alreadyReloading;
public bool needTimer;

void Start () {
    alreadyReloading = false;
    needTimer = false;
}

IEnumerator uztaisyt(){
    Debug.Log ("REEELOUUUDING!");
    yield return new WaitForSeconds(6.5f);
    ammo += 1;
    alreadyReloading = false;
}

void Update () {
    if (ammo < 5.0f) {
        if(alreadyReloading == false){
            progress.fillAmount = 1.0f;
            needTimer = true;
            StartCoroutine(uztaisyt());
            alreadyReloading = true;
        }
        if (needTimer == true) {
            timer ("");
        }
    }
}

void timer(string tipas){
    progress.fillAmount -=  Time.deltaTime / 6.5f;
}

}