2017-08-29 82 views
0

不知道爲什麼會發生這種情況,但是此代碼允許在重新加載後觸發超過3顆子彈。我試圖找出原因。我想這可能是檢查這個問題之間的時間,但我可能是錯的。更多子彈產卵超出允許範圍

任何幫助,將不勝感激。

public bool isFiring; 
public bool isReloading = false; 
public BulletController bullet; // Reference another script 
public float bulletSpeed; // bullet speed 
public float timeBetweenShots; // time between shots can be fired 
private float shotCounter; 
public Transform firePoint; 
public static int ammoRemaining = 3; 
public static int maxAmmo = 3; 
public Transform ammoText; 
// Use this for initialization 
void Awake() { 
    isReloading = false; 
    ammoRemaining = maxAmmo; 
} 

// Update is called once per frame 
void Update() { 
    if(isFiring == true) 
    { 
     shotCounter -= Time.deltaTime; 
     if(shotCounter <= 0 && ammoRemaining > 0 && isReloading == false) 
     { 
      shotCounter = timeBetweenShots; 
      BulletController newBullet = Instantiate(bullet, firePoint.position, firePoint.rotation) as BulletController; // creates a new instance of the bullet 
      newBullet.speed = bulletSpeed; 
      ammoRemaining -= 1; 
      ammoText.GetComponent<Text>().text = "Ammo:" + ammoRemaining; 
     } 

} 
else if (ammoRemaining == 0) 
{ 
    StartCoroutine(Reload()); 
} 
else 
{ 
    shotCounter = 0; 
} 
} 
public IEnumerator Reload() 
{ 
    isReloading = true; 
    ammoText.GetComponent<Text>().text = "REL..."; 
    yield return new WaitForSeconds(2); 
    ammoRemaining = maxAmmo; 
    isReloading = false; 
    ammoText.GetComponent<Text>().text = "Ammo:" + ammoRemaining; 
} 
+2

它看起來像你的刷新()協同程序是當你用完彈藥時會在Update()中多次調用 - 除非任何set「isFiring」阻止了這一點... – ryeMoss

+0

@ryemoss isFiring從另一個腳本設置如此 if(Input.GetMouseButtonDown(0)) {player} {playerGun.isFiring = true; } else if(Input.GetMouseButtonUp(0)) playerGun.isFiring = false; } – Robertgold

+1

因此,當您觸發最後一顆子彈時,您將開始重新加載,但在放開鼠標按鈕之前,很多幀都會通過並重新加載()將被多次調用。這可能不是你的問題的原因 - 但應該以任何方式解決。你應該確保在啓動協程之前你還沒有重新加載。 – ryeMoss

回答

1

(如討論)的問題是,你的刷新()協同程序獲取調用內更新()額外的時間你火最後一投後,讓MouseButton的走之前(0)。爲了避免這種情況,我建議檢查,以確保你是不是已經開始協程前重裝,:

else if (ammoRemaining == 0 && !isReloading) 
{ 
    StartCoroutine(Reload()); 
} 
2

這是一個題外話,不解決您的問題,但爲避免你未來的問題,特別是與表現。如果你正計劃開發一個3D射擊,我建議你不要實例子彈(除非你打算創造一些時間的推移場景)

的原因有兩個:

  • 您需要實例化和銷燬每秒
  • 許多GameObjects如果你給一個現實的速度子彈,它不應該 可以看到現場

我假設實例子彈的原因,你多爲followi NG二:

  • 要創建的東西離開真快,當你按下拍攝
  • 要檢測,如果你打你的目標與OnCollisionEnter()或類似

這樣我就可以了 桶一些視覺效果給你一些你可以試試的東西,而不是實例化子彈。

1-要代表拍攝,您可以在拍攝時將閃光燈放在拍攝結束時附加一盞燈。您可以在檢查員中選擇該燈的顏色,長度,強度......。

在下面的腳本中,您將瞭解如何在拍攝過程中激活和停用燈光效果的示例。它還控制拍攝之間的時間間隔。沒有任何一種協程。

public Light gunLight; 
public float timeBetweenBullets = 0.15f; 

void Update() 
{ 
    // Add the time since Update was last called to the timer. 
    timer += Time.deltaTime; 

    // If the Fire1 button is being press and it's time to fire... 
    if(Input.GetButton ("Fire1") && timer >= timeBetweenBullets) 
    { 
     Shoot(); 
    } 

    // If the timer has exceeded the proportion of timeBetweenBullets that the effects should be displayed for... 
    if(timer >= timeBetweenBullets * effectsDisplayTime) 
    { 
     DisableEffects(); 
    } 
} 

public void DisableEffects() 
{ 
    // Disable the line renderer and the light. 
    gunLight.enabled = false; 
} 

void Shoot(){ 
    timer = 0f; 
    // Enable the light. 
    gunLight.enabled = true; 

} 

2-第二部分是如何如果玩家在正確的方向已拍攝檢測。爲了解決這個問題,你需要在拍攝時使用光線投射,並分析光線所擊中的是什麼。

爲了做到這一點,你應該修改上面以下行拍攝方法:

void Shoot() 
    { 
     // Reset the timer. 
     timer = 0f; 

     // Enable the light. 
     gunLight.enabled = true; 

     // Set the shootRay so that it starts at the end of the gun and points forward from the barrel. 
     shootRay.origin = transform.position; 
     shootRay.direction = transform.forward; 

     // Perform the raycast against gameobjects on the shootable layer and if it hits something... 
     if(Physics.Raycast (shootRay, out shootHit, range, shootableMask)) 
     { 
      // Try and find an EnemyHealth script on the gameobject hit. 
      EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth>(); 

      // If the EnemyHealth component exist... 
      if(enemyHealth != null) 
      { 
       // ... the enemy should take damage. 
       enemyHealth.TakeDamage (damagePerShot, shootHit.point); 
      } 

      // Set the second position of the line renderer to the point the raycast hit. 
      gunLine.SetPosition (1, shootHit.point); 
     } 
     // If the raycast didn't hit anything on the shootable layer... 
     else 
     { 
      // ... set the second position of the line renderer to the fullest extent of the gun's range. 
      gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range); 
     } 
    } 

現在你的拍攝方法投下光線,以防射線擊中一個敵人(這是一個遊戲物體標記爲敵人)它會執行一些操作。在這個特殊的情況下,我認爲敵人已經附加了一個腳本來減少它在被射擊時的生命。

可以使拍攝的特效更加複雜,例如:添加聲音,呈現一條線,一些粒子系統模擬粉末...

你就可以了,我覺得你應該,從Unity官方網站查詢本教程中,得到什麼,我只是在我的答覆中提到一個更好的瞭解,並讓你的遊戲一些額外的想法:

https://unity3d.com/learn/tutorials/projects/survival-shooter/harming-enemies?playlist=17144

+0

所以當實例化時不需要產生多個對象 – Robertgold

+0

你可以產生對象,這是沒有問題的。例如敵人或什麼。子彈的問題是你會創造很多很快,你幾乎看不到它們。所以如果你可以使用其他更便宜的引擎來達到同樣的效果,那麼效果會更好 –

+0

我只允許每隔幾秒鐘發射3顆子彈,這樣會不會影響到 – Robertgold