2016-05-05 5 views
2

現在、2Dトップダウンゲームを開発中で、私のTurret AIに問題があります。プレーヤが静止しているときは、タレットが撮影を停止する以外は、すべてが完全に機能します。弾丸タイマーは、時間の経過と共に増加するのではなく、プレーヤーが停止すると増加を停止します。私はそれがTime.deltaTimeとフレームをリフレッシュすることと関係があると推測していますが、回避策を見つけることができませんでした。 IEnumeratorとwaitforsecondsで攻撃関数を記述する必要がありますか?それは簡単な問題だと感じていますが、私はそれを解決することができません。助けてくれてありがとう。ここに私のコードです:Unity3d - プレイヤーが静止しているときにタレットが撮影を停止する

TurretAIコード

using UnityEngine; 
using System.Collections; 

public class TurretAI : MonoBehaviour 
{ 
    public float FireRate; 
    public float bulletSpeed; 
    public float bulletTimer; 

    public GameObject Gun; 
    public GameObject bullet; 
    public Transform target; 


    public void Attack() 
    {  
     bulletTimer += Time.deltaTime; 

     if (bulletTimer >= FireRate) 
     { 
      Vector2 direction = target.transform.position - transform.position; 
      direction.Normalize(); 

      GameObject bulletClone; 
      bulletClone = Instantiate (bullet, Gun.transform.position, Gun.transform.rotation) as GameObject; 
      bulletClone.GetComponent<Rigidbody2D>().velocity = direction * bulletSpeed; 

      bulletTimer = 0; 
     } 
    } 
} 

そして、これは私があなたのプレイヤーのそれは動いていないときrigidBody2Dが眠っているが(これはエンジンがあると思いタレットトリガ・コード

using UnityEngine; 
using System.Collections; 

public class TurretTrigger : MonoBehaviour 
{ 
    public TurretAI turretAI; 

    void Awake() 
    { 
     turretAI = gameObject.GetComponentInParent<TurretAI>(); 
    } 

    void OnTriggerStay2D(Collider2D Trigger) 
    { 
     if (Trigger.CompareTag ("Player")) 
     { 
      turretAI.Attack(); 
     } 
    } 
} 
+0

「Time.timeScale」はいつでも変更できますか?もしあなたが 'Time.deltaTime'を' Time.unscaledDeltaTime'に変更すると助けになるかもしれません。 –

+0

私はタイムスケールをまったく変更していません。実際に何が起きているのかをビデオで記録することができれば助かります。 – lorrotar

+1

OnTriggerStay2Dはすべてのフレームで呼び出しますか? Debug.Logをそこに置き、衝突していないかどうか確認してください。次のコードは大丈夫です。 – Bivis

答えて

2

ですパフォーマンスを最適化し、何もしていない)。 rigidBodyがスリープすると、OnTriggerStay2Dはそれらの検出を停止します。プレイヤーのrigidBody2DrigidBody2D.WakeUp()を呼び出すと、rigidBodyは強制的に起動し、トリガーボックスで検出されます。

rigidBodyが今すぐ起きていることを確認するより効率的な方法が見つかりません。あなたの問題を引き起こしているかどうかを確認するためにこれを試してください。そうであれば、より効率的に寝るridgidBodyの方法を見つけることを試みてください!

編集:Gunnar Bは、これがインスペクタで設定できることを指摘しました。あなたのプレーヤーのRigidBody`コンポーネントに移動し、 'Sleeping Mode'を 'Never Sleep'に設定します。

+2

同じことを書こうとしていた。私は思うが、あなたは剛体のコンポーネントで睡眠モードを設定することができます。 (決して寝ることはできません) –

+1

ニース、私は私の答えを更新しました! –

+1

私はそれがそれと同じくらい簡単なものだと確信していました。どうもありがとうございました。問題解決=) – lorrotar

関連する問題