兩種方式在 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);
}
}