2017-02-07 1 views
1

[ユニティ5.5.1f1] [C#の]オーディオは、後でそれが

必要以上に遊んで私は同じようにすぐにリロードを開始するとサウンドを再生することになっているリロードスクリプトを作りました。 スクリプトは完璧に動作しますが、リロードが完了するとサウンドが正確に再生されます。 現在の行の外に行を移動すると、if (currentClip <= 0 || pressedR == true)の下のtoも機能しません。 誰かが再読み込みが始まるとすぐにサウンドを再生する方法を知っていますか? (すべての予備弾薬も枯渇したとき、好ましくは、if (totalAmmo > 1)の下で、それが再生されませんように)

// Update is called once per frame 
void FixedUpdate() 
{ 
    if (Input.GetKey(KeyCode.Mouse0) && counter > DelayTime && reloading == false)                 
    { 
     Instantiate(Bullet, transform.position, transform.rotation); //Spawning the bullet 
     currentClip += -1; 
     counter = 0; 
    } 
    if (Input.GetKey(KeyCode.R)) //This will allow the player to use "R" to reload. 
    { 
     pressedR = true; 
    } 
    //Start of reloading 
    if (currentClip <= 0 || pressedR == true) 
    { 
     reloading = true; 
     if (totalAmmo > 1) 
     { 
      GetComponent<AudioSource>().Play();  // <-- AUDIO AUDIO AUDIO 
      reloadCounter += Time.deltaTime; 
      if (reloadCounter > reloadTime) 
      { 
       missingAmmo = clipSize - currentClip; 
       if (totalAmmo >= missingAmmo) 
       { 
        totalAmmo += currentClip; 
        totalAmmo += -clipSize; 
        currentClip = clipSize; 
       } 
       else 
       { 
        currentClip += totalAmmo; 
        totalAmmo = 0; 
       } 
       reloading = false; 
       pressedR = false; 
       reloadCounter = 0; 
       //End of reloading 

      } 
     } 
    } 
    counter += Time.deltaTime; 
} 

答えて

3

ここで何が起こっていることはリロードするまでそれを再起動し続けている、クリップがあなたのリロード処理中にすべてのフレームを再生されているということです完了しました。その結果、クリップが最後まで再生されるのを聞くことができません。そのため、オーディオがリロード処理後に再生されているように見えます。

この問題を解決するには、再ロードロジックの外側にAudioSource.Play()を呼び出すことをお勧めします。ただし、現在、再ロード処理には、現在のクリップが空の場合、またはが押された場合に、複数のエントリポイントがあります。私は両方の条件を同じif条件に移動し、どちらかがtrueの場合にリロードを開始する単一のフラグを設定することをお勧めします。それが唯一のリロードごとに一度起動されますので、その時点で、あなたは、AudioSource.Play()を呼び出すことができます。私は前にそれが全体の多くをしていなかったことにするので、私の目的のために、あなたのreloadingフラグを充当

void FixedUpdate() 
{ 
    if (Input.GetKey(KeyCode.Mouse0) && counter > DelayTime && reloading == false)                 
    { 
     // ... 
    } 

    // Start reloading if not already reloading and either R is pressed or clip is empty 
    if (!reloading && (Input.GetKey(KeyCode.R) || currentClip <= 0)) 
    { 
     reloading = true; 
     GetComponent<AudioSource>().Play(); 
    } 

    //Start of reloading 
    if (reloading) 
    { 
     if (totalAmmo > 1) 
     { 
      reloadCounter += Time.deltaTime; 
      if (reloadCounter > reloadTime) 
      { 
       missingAmmo = clipSize - currentClip; 
       if (totalAmmo >= missingAmmo) 
       { 
        totalAmmo += currentClip; 
        totalAmmo += -clipSize; 
        currentClip = clipSize; 
       } 
       else 
       { 
        currentClip += totalAmmo; 
        totalAmmo = 0; 
       } 
       reloading = false; 
       reloadCounter = 0; 
       //End of reloading 
      } 
     } 
    } 
    counter += Time.deltaTime; 
} 

注意を。これを行うことで、コードからpressedRを取り除くことができ、少し複雑さを軽減しました。

希望すると便利です。ご質問がある場合はお知らせください。

+0

しかし、これで問題になるのは、弾薬が残っていなくてもリロードサウンドが再生されるということです。 – RnRoger

+0

技術的には正常に動作しましたが、他の 'GetComponent ().Play()'を削除した場合のみ – RnRoger

+0

また、ガンが自動的にリロードされたときに音が鳴らないようになりました(if(currentClip <= 0) – RnRoger

関連する問題