IEnumerator ShootRoutine(ShootObject.AimInfo aimInfo = null) { if (uAnimation != null) { uAnimation.AttackRange(); } AttackStats aStats = ModifyAttackStatsToLevel(weaponList[weaponID].GetRuntimeAttackStats()); aStats = ModifyAttackStatsToExistingEffect(aStats); //aStats=ModifyAttackStatsToExistingEffect(weaponList[weaponID].GetRuntimeAttackStats()); AttackInstance aInstance = new AttackInstance(this, aStats); int weapID = weaponID; //to prevent weapon switch and state change while delay and firing multiple so int spread = weaponList[weapID].spread; if (spread > 1) { aInstance.aStats.damageMin /= spread; aInstance.aStats.damageMax /= spread; } float startAngle = spread > 1 ? -weaponList[weapID].spreadAngle / 2f : 0; float angleDelta = spread > 1 ? weaponList[weapID].spreadAngle / (spread - 1) : 0; List <Collider> soColliderList = new List <Collider>(); //colliders of all the so fired, used to tell each so to ignore each other for (int i = 0; i < weaponList[weapID].shootPointList.Count; i++) { Transform shootPoint = weaponList[weapID].shootPointList[i]; float recoilSign = (Random.value < recoilSignTH ? -1 : 1); recoilSignTH = Mathf.Clamp(recoilSignTH + (recoilSign > 0 ? 0.25f : -0.25f), 0, 1); float recoilValue = recoilSign * Random.Range(0.1f, 1f) * GetRecoil(); Quaternion baseShootRot = shootPoint.rotation * Quaternion.Euler(0, recoilValue, 0); for (int m = 0; m < Mathf.Max(1, spread); m++) { Vector3 shootPos = shootPoint.position; if (spread > 1) { shootPos = shootPoint.TransformPoint(new Vector3(0, 0, Random.Range(-1.5f, 1.5f))); } Quaternion shootRot = baseShootRot * Quaternion.Euler(0, startAngle + (m * angleDelta), 0); //GameObject soObj=(GameObject)Instantiate(weaponList[weapID].shootObject, shootPos, shootRot); GameObject soObj = ObjectPoolManager.Spawn(weaponList[weapID].shootObject, shootPos, shootRot); ShootObject soInstance = soObj.GetComponent <ShootObject>(); soInstance.IgnoreCollider(GetCollider()); for (int n = 0; n < soColliderList.Count; n++) { soInstance.IgnoreCollider(soColliderList[n]); } if (soInstance.GetCollider() != null) { soColliderList.Add(soInstance.GetCollider()); } soInstance.Shoot(thisObj.layer, GetRange(), shootPoint, aInstance.Clone(), aimInfo); //soInstance.Shoot(thisObj.layer, GetRange(), shootPoint, aInstance.Clone(), hit); } TDS.CameraShake(weaponList[weapID].recoilCamShake); if (weaponList[weapID].shootPointDelay > 0) { yield return(new WaitForSeconds(weaponList[weapID].shootPointDelay)); } if (weapID >= weaponList.Count) { break; } } }
IEnumerator _ShootTarget(float targetDist) { if (targetDist > GetRange()) { yield break; //if target is out of range, dont continue } currentCD = cooldown; //set the cooldown if (uAnimation != null) { uAnimation.AttackRange(); //play the attack animation } List <Collider> soColliderList = new List <Collider>(); //colliders of all the shoot-objs fired, used to tell each so to ignore each other //loop through the shoot-points, fire an shoot-object for each of them for (int i = 0; i < shootPointList.Count; i++) { //create a new attak instance for the attack AttackInstance attInstance = new AttackInstance(this, ModifyAttackStatsToExistingEffect(attackStats.Clone())); //record the target position, in case the target get destroyed before all shoot point has fired if (target != null) { targetLastPos = target.thisT.position; } //create an aimInfo instance for the shootObject ShootObject.AimInfo aimInfo = target != null ? new ShootObject.AimInfo(target) : new ShootObject.AimInfo(targetLastPos); //get the shoot rotation Quaternion shootRot = shootPointList[i].rotation; if (alwaysShootTowardsTarget && target != null) { shootRot = Quaternion.LookRotation(target.thisT.position - thisT.position); } //spawn the shootobject GameObject soObj = ObjectPoolManager.Spawn(shootObject, shootPointList[i].position, shootRot); ShootObject soInstance = soObj.GetComponent <ShootObject>(); //inform the shootobject to ignore the certain collider soInstance.IgnoreCollider(GetCollider()); for (int n = 0; n < soColliderList.Count; n++) { soInstance.IgnoreCollider(soColliderList[n]); } if (soInstance.GetCollider() != null) { soColliderList.Add(soInstance.GetCollider()); } //fire the shootobject soInstance.Shoot(thisObj.layer, GetRange(), shootPointList[i], attInstance, aimInfo); //delay a bit before the next shoot point, if a delay has been specified if (shootPointDelay > 0) { yield return(new WaitForSeconds(shootPointDelay)); } } yield return(null); }