private void ShootTrajectoryCast(CharacterShooter shooter, float deviation, CharacterShooter.ShotType shotType) { TrajectoryRenderer.TrajectoryResult result = this.GetTrajectoryResult(shooter); if (result.hit.collider) { Vector3 pointA = result.hit.point; Vector3 pointB = result.hit.point; if (result.points.Length > 2) { pointA = result.points[result.count - 2]; pointB = result.points[result.count - 1]; } Vector3 direction = (pointA - pointB).normalized; Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, direction); GameObject other = result.hit.collider.gameObject; this.ExecuteShootActions( other, result.hit.point, rotation ); IgniterOnReceiveShot igniter = other.GetComponent <IgniterOnReceiveShot>(); if (igniter) { igniter.OnRecevieShot(shooter, shotType); } if (!Mathf.Approximately(this.pushForce, 0f) && result.hit.rigidbody && direction != Vector3.zero) { result.hit.rigidbody.AddForceAtPosition( -direction * this.pushForce, result.hit.point, ForceMode.Impulse ); } if (this.prefabImpactEffect) { GameObject impact = PoolManager.Instance.Pick(this.prefabImpactEffect); impact.transform.SetPositionAndRotation(result.hit.point, rotation); } this.shootTrail.position1 = shooter.muzzle.GetPosition(); this.shootTrail.position2 = result.hit.point; } if (this.shootTrail.useShootingTrail) { ShootingTrailRenderer.Create(this.shootTrail, result); } }
public override bool InstantExecute(GameObject target, IAction[] actions, int index) { CharacterShooter shooterValue = this.shooter.GetComponent <CharacterShooter>(target); if (shooterValue == null) { return(true); } switch (this.targetType) { case TargetType.Target: IgniterOnReceiveShot igniterTarget = this.target.GetComponent <IgniterOnReceiveShot>(target); if (igniterTarget != null) { igniterTarget.OnRecevieShot(shooterValue, this.shotType); } break; case TargetType.AreaOfEffect: Vector3 pos = this.position.GetPosition(target); float rad = this.radius.GetValue(target); QueryTriggerInteraction query = QueryTriggerInteraction.Collide; Collider[] colliders = Physics.OverlapSphere(pos, rad, -1, query); for (int i = 0; i < colliders.Length; ++i) { IgniterOnReceiveShot colliderIgniter = colliders[i].gameObject.GetComponent <IgniterOnReceiveShot>(); if (colliderIgniter != null) { colliderIgniter.OnRecevieShot(shooterValue, this.shotType); } } break; } return(true); }
private void ShootGenericCast(CharacterShooter shooter, float deviation, CharacterShooter.ShotType shotType, CastType castType) { ShootData shootData = this.GetShootData(shooter); Vector3 shootPositionRaycast = shootData.originRaycast; Vector3 shootPositionWeapon = shootData.originWeapon; Vector3 shootPositionTarget = shootData.destination; if (deviation > 0f) { shootPositionTarget += this.CalculateError( shooter.gameObject, shootPositionRaycast, shootPositionTarget, deviation ); } Vector3 direction = (shootPositionTarget - shootPositionRaycast).normalized; int hitCounter = 0; switch ((((int)castType) & 2) >> 1) { case 0: // Raycast hitCounter = Physics.RaycastNonAlloc( shootPositionRaycast, direction, this.bufferCastHits, this.distance, this.layerMask, this.triggersMask ); break; case 1: // SphereCast hitCounter = Physics.SphereCastNonAlloc( shootPositionRaycast, this.radius, direction, this.bufferCastHits, this.distance, this.layerMask, this.triggersMask ); break; } int maxCount = Mathf.Min(hitCounter, this.bufferCastHits.Length); Array.Sort(this.bufferCastHits, 0, maxCount, SHOT_COMPARE); for (int i = 0; hitCounter > 0 && i < maxCount; ++i) { if (this.bufferCastHits[i].collider.gameObject.Equals(shooter.gameObject)) { continue; } Vector3 rotationDirection = (shootPositionWeapon - this.bufferCastHits[i].point).normalized; Quaternion rotation = Quaternion.FromToRotation(Vector3.forward, rotationDirection); GameObject other = this.bufferCastHits[i].collider.gameObject; this.ExecuteShootActions(other, this.bufferCastHits[i].point, rotation); IgniterOnReceiveShot igniter = other.GetComponent <IgniterOnReceiveShot>(); if (igniter) { igniter.OnRecevieShot(shooter, shotType); } if (!Mathf.Approximately(this.pushForce, 0f) && this.bufferCastHits[i].rigidbody) { this.bufferCastHits[i].rigidbody.AddForceAtPosition( -rotationDirection * this.pushForce, this.bufferCastHits[i].point, ForceMode.Impulse ); } shootPositionTarget = this.bufferCastHits[i].point; if (this.prefabImpactEffect) { GameObject impact = PoolManager.Instance.Pick(this.prefabImpactEffect); impact.transform.SetPositionAndRotation(this.bufferCastHits[i].point, rotation); } if ((((int)castType) & 1) == 0) { break; } } if (this.shootTrail.useShootingTrail) { this.shootTrail.position1 = shootPositionWeapon; this.shootTrail.position2 = shootPositionTarget; ShootingTrailRenderer.Create(this.shootTrail); } }