用Coroutin連續發射

兩種方式在 Laser Defender 中使用Coroutin連續發射。

1. 我的方式:

    float projectileSpeed = 20.0f;
    float projectileFiringPeriod = 0.1f;

    //support fire's rate
    bool isFired = false;

// Update is called once per frame
    void Update()
    {
        Fire();
    }


    /// <summary>
    /// 控制發射速度).
    /// </summary>
    /// <returns></returns>
    IEnumerator FireContinuously()
    {
        GameObject laser = Instantiate(laserPrefab, transform.position, Quaternion.identity) as GameObject;
        laser.GetComponent<Rigidbody2D>().velocity = new Vector2(0, projectileSpeed);
        isFired = true;

        yield return new WaitForSeconds(projectileFiringPeriod);
        isFired = false;
    }

    /// <summary>
    /// player controll to fire laser
    /// </summary>
    private void Fire()
    {
        if (Input.GetButton("Fire1") && !isFired)
        {
            StartCoroutine(FireContinuously());
        }
    }

二、from lesson
 

    /// <summary>
    /// player controll to fire laser
    /// </summary>
    private void Fire()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            firingCoroutine = StartCoroutine(FireContinuously());
        }
        if (Input.GetButtonUp("Fire1"))
        {
            StopCoroutine(firingCoroutine);
        }
    }

    /// <summary>
    /// allow holding botton and fire in decided rate(控制發射速度).
    /// </summary>
    /// <returns></returns>
    IEnumerator FireContinuously()
    {
        while (true)
        {
            GameObject laser = Instantiate(laserPrefab, transform.position, Quaternion.identity) as GameObject;
            laser.GetComponent<Rigidbody2D>().velocity = new Vector2(0, projectileSpeed);
            AudioSource.PlayClipAtPoint(shootSound, Camera.main.transform.position, shootSoundVolume);

            yield return new WaitForSeconds(projectileFiringPeriod);
        }
    }