2017-05-13 12 views
1

私は敵の射撃でこの問題を抱えています。自分のプレイヤーがどこにいるのかを検出するためにレイキャスティングを使っているのを見て、敵を撃って欲しいと思っています。各インスタンシエートされた箇条書きの間で遅れてはいけません!したがって、各箇条書きの間の遅延ではなく、弾丸が常に生成されています。私はこの問題を解決するためにさまざまなソリューションを試しましたが、何も効果がありませんでした。私はIEnumerator、オブジェクトプーリング、カウントダウンタイマーを作成し、& invokerepeatingを呼び出そうとしましたが、まだ私の弾丸はまだ遅延なしで即座にインスタンス化されています。インスタンス化された各箇条書きの間に遅延を持つ方法を知っていますか?ありがとうございました!Unity2D:敵撃ち

これは私のスクリプトです:

public GameObject bulletPrefab; 
public Transform bulletSpawn; 
public Transform sightStart, sightEnd; 
public bool spotted = false; 

void Update() 
{  
    RayCasting(); 
    Behaviours(); 
} 

void RayCasting() 
{ 
    Debug.DrawLine (sightStart.position, sightEnd.position, Color.red); 
    spotted = Physics2D.Linecast (sightStart.position, sightEnd.position, 1 << LayerMask.NameToLayer("Player")); 
} 

void Behaviours() 
{ 
     if (spotted == true) { 
      //Invoke("Fire", cooldownTimer); 
      Fire(); 
    } else if (spotted == false) { 
     //CancelInvoke(); 
    } 
} 

void Fire() 
{  
     GameObject bullet = (GameObject)Instantiate (bulletPrefab); 
     //GameObject bullet = objectPool.GetPooledObject(); 
     bullet.transform.position = transform.position; 
     bullet.GetComponent<Rigidbody2D>().velocity = bullet.transform.up * 14; 
     Destroy (bullet, 2.0f); 
} 

答えて

1

あなたは弾丸が生み出される速度を絞る必要があります。あなたはになりますそれはフレーム数に基づいていますが、それは火災率がゲームのパフォーマンスによって異なるため、悪いアプローチです。

より良いアプローチは、変数を使用して、再起動するまでにどれくらいの時間が経過する必要があるかを追跡することです。私はこれを「次の時間に」(TTNS)と呼ぶ。

  • 時間が迫っていれば、TTNSを減らす。
  • もしそうならTTNSが0以下
  • かどうかを確認します。
    • セットTTNS火の私達の所望の速度に応じて適切に。
    • 火災これは、あなただけのフレームごとに一度Fire()を呼び出すことを前提としない

      private float fireRate = 3f; // Bullets/second 
      private float timeToNextShot; // How much longer we have to wait. 
      
      void Fire() {  
           // Subtract the time since the last from TTNS . 
           timeToNextShot -= time.deltaTime; 
      
           if(timeToNextShot <= 0) { 
            // Reset the timer to next shot 
            timeToNextShot = 1/fireRate; 
      
            //.... Your code 
            GameObject bullet = (GameObject)Instantiate (bulletPrefab); 
            //GameObject bullet = objectPool.GetPooledObject(); 
            bullet.transform.position = transform.position; 
            bullet.GetComponent<Rigidbody2D>().velocity = bullet.transform.up * 14; 
            Destroy (bullet, 2.0f); 
           } 
      } 
      

何かのようなショット...(そうでなければ、経過時間がnextShot複数回から差し引かれます) 。

elapsedTimeの解像度が時間の経過と共に減少するので、絶対時間(time.elapsedTime> xまで待機)を定義するのではなく、この方法(タイムスパンからスライスを減算する)を選択しました。この方法は、数時間のゲームプレイ。

+1

ありがとうございます!私はそれをもっと良く理解しています!ほんとうにありがとう –

関連する問題