Unity2D C#重新加载进度条不能正常工作

时间:2015-09-03 11:36:06

标签: c# user-interface unity3d progress-bar unity3d-gui

Reloading bar problem

所以我正在制作一个自上而下的坦克射击游戏,我想制作一个比以前更好的重装系统。所以我认为我需要一些进步之王。我知道如何制作它所以我开始这样做。问题是它没有正常工作。正如我在上面的.gif中所示,当您第二次拍摄时,进度条不会下降。因为我是团结的新手,所以我仍然不太了解一切。所以我来到这里,也许有人可以提供帮助。

编辑: 我刚发现另一个问题,也许是为什么我有这个问题的答案。我的脚本第二次尝试重新加载,我的#34; needTimer" bool是假的,因此进度条在它错误时不会下降。新的问题是为什么它变得虚假而不是真实? 我的重装脚本:

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

2 个答案:

答案 0 :(得分:0)

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

确保在调用 uztaisyt()后立即启动 needtimertime()(如果尚未运行)(并在同一帧更新中调用) ,您可以尝试以下更新到Reload脚本,(基本上更改为Update()方法以及何时设置/如何设置_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 ());
  }
}

答案 1 :(得分:0)

我发现了我的问题并修复了它。 问题是 needTimer 变得虚假。所以我找到了并删除了它。

我的新代码:

using UnityEngine;

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

公共课重新加载: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;
}

}