IEnumerator DestroysStuff() { // 開始造成傷害前先等一下 yield return(new WaitForSeconds(startDamageWait)); while (true) { // 對目前連線的所有敵人做處理 foreach (GameObject stuff in GetNearbyEnemy()) { // 先取得他們的HP DestroyAble destroyAble = stuff.GetComponent <DestroyAble>(); // 播放電擊聲音 thunderAudioSource.PlayOneShot(thunderSound, 0.3f); // 產生特效 Instantiate(explosion, stuff.transform.position, stuff.transform.rotation); // 扣血 destroyAble.health -= damage; } // 每波傷害之間的間隔 yield return(new WaitForSeconds(damageInterval)); } }
int weaponNumber = (int)Weapon.NumberOfWeapon; // 取得列舉的大小 // Use this for initialization void Start() { // 取得元件 playerRigidbody = GetComponent <Rigidbody>(); playerDestroyAble = GetComponent <DestroyAble>(); // 取得AudioSource元件 因為有兩個所以用陣列 playerAudioSourceS = GetComponents <AudioSource>(); playerAudioSource = playerAudioSourceS[0]; playerAudioSource2 = playerAudioSourceS[1]; // 設定初始武器 weapon = Weapon.basic; }
void Update() { // 偵測是否切換武器 SwitchWeapon(); // 武器種類 switch (weapon) { case Weapon.basic: { // 如果按下了Fire1鍵 而且現在的時間已經超過可以發射的時間 if (Input.GetButton("Fire1") && Time.time >= basicWeapon.NextFire) { // 下一次可以發射的時間往後延一個fireRate basicWeapon.NextFire = Time.time + basicWeapon.fireRate; // 建立子彈物件 Instantiate(basicWeapon.shot, basicWeapon.shotSpawn.position, basicWeapon.shotSpawn.rotation); // 播放槍聲 playerAudioSource2.Play(); } // 切換武器欄位 } break; case Weapon.GatlingGun: { // 如果按下了Fire1鍵 而且現在的時間已經超過可以發射的時間 if (Input.GetButton("Fire1") && Time.time >= gatlinWeapon.NextFireGatlin) { // 隨機產生一個子彈發射位置 模擬機槍 Vector3 shotSpawnGatlin = new Vector3(Random.Range(basicWeapon.shotSpawn.position.x - 0.5f, basicWeapon.shotSpawn.position.x + 0.5f), basicWeapon.shotSpawn.position.y, basicWeapon.shotSpawn.position.z); // 下一次可以發射的時間往後延一個fireRate gatlinWeapon.NextFireGatlin = Time.time + gatlinWeapon.fireRateGatlin; // 建立子彈物件 Instantiate(basicWeapon.shot, shotSpawnGatlin, basicWeapon.shotSpawn.rotation); // 播放槍聲 playerAudioSource2.Play(); } } break; case Weapon.Laser: { if (Input.GetButton("Fire1")) { // 用laserCreated變數避免重複生成雷射 if (laserWeapon.LaserCreated == false) { // 生成雷射 laserWeapon.CloneLaser = Instantiate(laserWeapon.laser, basicWeapon.shotSpawn.position, basicWeapon.shotSpawn.rotation); // 取得子物件的Linerenderer laserWeapon.LaserLine = laserWeapon.CloneLaser.GetComponentInChildren <LineRenderer>(); // 重置設線起始寬度 laserWeapon.LaserLine.startWidth = 0; // 如果還沒有撥過這個音樂 if (playerAudioSource.isPlaying == false) { // 撥放nyanCat音樂 playerAudioSource.Play(); } else // 如果已經撥過 { // 取消暫停 playerAudioSource.UnPause(); } // 避免重複執行 laserWeapon.LaserCreated = true; } // 讓射線寬度逐漸增加 if (laserWeapon.LaserLine.startWidth < 0.3) { laserWeapon.LaserLine.startWidth += 0.005f; } else if (laserWeapon.LaserLine.startWidth < 1.2f) { laserWeapon.LaserLine.startWidth += 0.16f; } // 用來儲存射線碰到的物體的資訊 RaycastHit myRaycastHit; // 利用設線偵測是否擊中敵人 // 如果有擊中 if (Physics.Raycast(transform.position, transform.TransformDirection(transform.forward), out myRaycastHit)) { destroyable = myRaycastHit.collider.gameObject.GetComponent <DestroyAble>(); // 限制雷射傷害速度 if (laserWeapon.NextLaserInterval <= Time.time) { destroyable.health -= laserWeapon.damage; laserWeapon.NextLaserInterval = Time.time + laserWeapon.laserInterval; // 生成擊中特效 Instantiate(laserWeapon.explosionOfLaser, new Vector3(transform.position.x, -6, myRaycastHit.transform.position.z), laserWeapon.explosionOfLaser.transform.rotation); Instantiate(laserWeapon.explosionOfLaser02, new Vector3(transform.position.x, 0, myRaycastHit.transform.position.z), laserWeapon.explosionOfLaser02.transform.rotation); } // 將雷射尾端設為設線所碰到的物體 laserWeapon.LaserLine.SetPosition(1, new Vector3(0, 0, myRaycastHit.transform.position.z + 2.5f)); } // 如果沒有擊中 else { // 射線長度設為固定值 laserWeapon.LaserLine.SetPosition(1, new Vector3(0, 0, 100)); } } // 如果不再按壓發射鍵 或者玩家已經消失 else if (Input.GetButtonUp("Fire1")) { // 重置射線的生成狀態 laserWeapon.LaserCreated = false; // 刪除剛才建立的射線物件 if (laserWeapon.CloneLaser != null) { Destroy(laserWeapon.CloneLaser); } // 暫停nyanCat音樂 playerAudioSource.Pause(); } // 如果射線的母物件存在 將他的座標設定為玩家的槍口位置 if (laserWeapon.CloneLaser != null) { laserWeapon.CloneLaser.transform.position = basicWeapon.shotSpawn.position - new Vector3(0, 0, 0.5f); } break; } case Weapon.Missile: { { // 如果按下了Fire1鍵 而且現在的時間已經超過可以發射的時間 if (Input.GetButton("Fire1") && Time.time >= missileWeapon.NextFireMissile) { // 下一次可以發射的時間往後延一個fireRate missileWeapon.NextFireMissile = Time.time + missileWeapon.fireRateMissile; // 建立子彈物件 Instantiate(missileWeapon.missile, basicWeapon.shotSpawn.position + new Vector3(0, 0, 0), basicWeapon.shotSpawn.rotation); // 播放在玩家物件身上的audio source 也就是槍聲 playerAudioSource2.Play(); } // 切換武器欄位 } break; } case Weapon.Thunder: { if (Input.GetButton("Fire1")) { if (thunderWeapon.ThunderCreated == false) { thunderWeapon.CloneThunder = Instantiate(thunderWeapon.Thunder, basicWeapon.shotSpawn.position, basicWeapon.shotSpawn.rotation); thunderWeapon.ThunderCreated = true; } } else if (Input.GetButtonUp("Fire1") || this.gameObject == null) { thunderWeapon.ThunderCreated = false; if (thunderWeapon.CloneThunder != null) { Destroy(thunderWeapon.CloneThunder); } } if (thunderWeapon.CloneThunder != null) { thunderWeapon.CloneThunder.transform.position = basicWeapon.shotSpawn.position - new Vector3(0, 0, 0.5f); } break; } default: break; } // 如果武器選擇已經不是閃電 if (weapon != Weapon.Thunder || playerDestroyAble.health <= 0) { // 重置生成閃電的布林 thunderWeapon.ThunderCreated = false; // 刪除閃電 if (thunderWeapon.CloneThunder != null) { Destroy(thunderWeapon.CloneThunder); } } // 如果武器選擇已經不是雷射 if (weapon != Weapon.Laser || playerDestroyAble.health <= 0) { laserWeapon.LaserCreated = false; if (laserWeapon.CloneLaser != null) { Destroy(laserWeapon.CloneLaser); } // 暫停nyanCat音樂 playerAudioSource.Stop(); } }