0

重装吧问题

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

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

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

2 回答 2

0

当您在第一次拍摄后(在动画中)将uztaisyt()作为协程启动时,needTimer设置为 true,并且在下一次 Update()调用中,needtimertime()协程将启动。由于uztaisyt()needtimertime()都具有相同的 6.5 秒等待时间,因此它们不会在同一帧更新时返回,因为needtimertime()将始终在uztaisyt()之后的下一帧中启动。而且,由于不能保证Update()调用之间的时间间隔,(请参阅时间和帧管理),此间隔可能超出预期,并且在第二次触发 后调用 uztaisyt()后, needtimertime()可能会在帧中立即返回 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 ());
  }
}
于 2015-09-03T15:33:18.477 回答
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;
}

}

于 2015-09-06T10:34:56.917 回答