private IEnumerator Shoot(int _index, int _weaponID) { BHealth target = null; BWeapon weapon = PlayerParameters.Instance.m_PlayerWeapons[m_CurrWeapons[_index]]; // Burst fire. for (int i = 0; i < weapon.m_Bursts; i++) { if (m_PlayerAmmo[_weaponID] > 0) { RecoilWeapons(_index); m_PlayerAmmo[_weaponID]--; StartCoroutine(m_PMain.m_PCamera.Shake(weapon.m_ShakeMagnitude, weapon.m_ShakeFrequency, weapon.m_ShakeDuration)); if (weapon.m_ShootSound) { m_WeaponAudio[_index].PlayOneShot(weapon.m_ShootSound); } if (weapon.GetType() == typeof(ProjectileWeapon)) { // Projectile starting position on left / right of camera. Vector3 pos = transform.position + (transform.rotation * new Vector3(((float)_index - 0.5f) * 8f, -1.5f, 1.0f)); Quaternion rot; // Target the surface on the center of the screen. RaycastHit hit; if (Physics.Raycast(pos, SceneCamera.Instance.transform.forward, out hit, Mathf.Infinity, PlayerParameters.Instance.m_TargetingLayers, QueryTriggerInteraction.Ignore)) { rot = Quaternion.LookRotation(hit.point - pos); target = hit.transform.GetComponent <BHealth>(); } else { rot = SceneCamera.Instance.transform.rotation; } // Instantiate projectile and initiate stats. BProjectile projectile = Instantiate(weapon.m_Model, pos, rot).AddComponent <BProjectile>(); projectile.Init((ProjectileWeapon)weapon, m_PMain.m_PMove.m_Velocity, target, m_PMain); } else { GameObject beam = m_BeamEffects[_index]; // Projectile starting position on left / right of camera. Vector3 pos = beam.transform.position; Quaternion rot; RaycastHit hit; float distance; if (Physics.Raycast(pos, SceneCamera.Instance.transform.forward, out hit, Mathf.Infinity, PlayerParameters.Instance.m_TargetingLayers, QueryTriggerInteraction.Ignore)) { beam.transform.rotation = Quaternion.LookRotation(hit.point - pos); if (Physics.Raycast(pos, hit.point - pos, out hit, Mathf.Infinity, weapon.m_CollisionLayers, QueryTriggerInteraction.Ignore)) { BHealth health; if (health = hit.transform.GetComponent <BHealth>()) { health.TakeDamage(weapon.m_Damage); } } distance = (hit.point - pos).magnitude; } else { distance = 10000.0f; } Vector3 beamScale = beam.transform.localScale; beamScale.x = ((BeamWeapon)weapon).m_BeamWidth; beamScale.y = ((BeamWeapon)weapon).m_BeamWidth; beamScale.z = distance; beam.transform.localScale = beamScale; beam.SetActive(true); } } else { m_BeamEffects[_index].SetActive(false); } // Case for delay between bursts. if (weapon.m_BurstDelay != 0.0f) { yield return(new WaitForSeconds(weapon.m_BurstDelay)); } } }