【问题标题】:Unity2D: Enemy ShootingUnity2D:敌人射击
【发布时间】:2017-05-13 16:12:29
【问题描述】:

我的敌人射击时遇到了这个问题,你看我正在使用光线投射来检测我的玩家在哪里,一旦检测到我希望敌人射击,到目前为止我已经完成了,但是每个之间没有延迟实例化的子弹!所以子弹是不断产生的,而不是每次产生之间的延迟。我已经尝试了很多不同的解决方案来解决这个问题,但没有任何效果!我已经尝试过 IEnumerator、对象池、创建倒数计时器以及调用和调用重复,但我的子弹仍然会立即实例化,没有任何延迟。有谁知道如何在每个实例化的子弹之间有延迟?谢谢!

这是我的脚本:

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);
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您需要限制子弹的生成速度。您可以基于帧数,但这是一种不好的方法,因为射速会随游戏性能而变化。

    更好的方法是使用变量来跟踪必须经过多长时间才能再次触发。我将其称为“Time To Next Shot”(TTNS)

    • 按已过去的时间递减 TTNS。
    • 检查 TTNS 是否为 0 或更小
    • 如果是这样:
      • 根据我们所需的射速设置 TTNS。
      • 开枪

    有点像..

    private float fireRate = 3f; // Bullets/second
    private float timeToNextShot; // How much longer we have to wait.
                                  // [Starts at zero so our first shot is instant]
    
    void Fire() {       
            // Subtract the time elapsed (since the last frame) 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);
            }
    }
    

    这确实假设您每帧只调用一次Fire()(否则将从nextShot 中多次减去经过的时间)。

    我选择这样做(从时间跨度中减去切片)而不是定义绝对时间(等到 time.elapsedTime > x),因为elapsedTime 的分辨率会随着时间的推移而降低,这种方法会导致故障经过几个小时的游戏。

    【讨论】:

    • 谢谢!!!我现在明白了很多!!!!我真的很感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多