0

リロードバーの問題

だから私は見下ろし型の戦車シューティングゲームを作っていて、以前よりも優れたリロードシステムを作りたいと思っています。それで、プログレスバーの王様が必要だという考えに至りました。作り方が分かったので作り始めました。問題は、それが適切に機能しないことです。上の .gif に示されているように、2 回目の撮影時にプログレス バーが下がらない。私は Unity を始めたばかりなので、まだすべてがよくわかっているわけではありません。だから私はここに来ました、誰かが助けてくれるかもしれません。

編集:私は別の問題を見つけました。おそらく、この問題が発生した理由の答えです。スクリプトを 2 回目にリロードしようとすると、"needTimer" ブール値が 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 ());
    }
}
4

2 に答える 2

0

(アニメーションで) 最初の撮影後にuztaisyt()をコルーチンとして開始すると、 needTimerが true に設定され、次の Update()呼び出しで、needtimertime()コルーチンが開始されます。uztaisyt ()needtimertime()の待機時間は同じ 6.5 秒であるため、 needtimertime()は常にuztaisyt ()の次のフレームで開始されるため、両方が同じフレーム更新で戻ることはありませんまた、 Update()呼び出し間の時間間隔が保証されていないため、(時間とフレームの管理を参照してください))、この間隔は予想以上である可能性があり、needtimertime () は、2 回目の起動後に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 ());
  }
}
于 2015-09-03T15:33:18.477 に答える
0

問題を見つけて修正しました。問題は、needTimerが false になることでした。だから私はどこを見つけてそれを取り除きました。

私の新しいコード:

using UnityEngine;

UnityEngine.UI の使用; System.Collections を使用します。

public class Reload : 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 に答える