IEnumerator Start()
        {
            parentArray   = new GameObject[128];           //Arbitrary array size; can be increased
            highestParent = 0;

            Vector3 explosionPosition = transform.position;

            // Apply damage to close by objects first
            Collider[] colliders = Physics.OverlapSphere(explosionPosition, explosionRadius);
            foreach (var hit in colliders)
            {
                if (AlreadyHit(hit.gameObject) == false)
                {
                    // Calculate distance from the explosion position to the closest point on the collider
                    Vector3 closestPoint = hit.ClosestPointOnBounds(explosionPosition);
                    float   distance     = Vector3.Distance(closestPoint, explosionPosition);

                    // The hit points we apply fall decrease with distance from the explosion point
                    float hitPoints = 1.0f - Mathf.Clamp01(distance / explosionRadius);
                    if (hit.gameObject.layer == PlayerWeapons.playerLayer)
                    {
                        CameraShake.ShakeCam(Mathf.Max(hitPoints * shakeFactor, minShake), 10, Mathf.Max(hitPoints * shakeFactor, .3f));
                    }
                    hitPoints *= explosionDamage;

                    // Tell the rigidbody or any other script attached to the hit object how much damage is to be applied!
                    if (hit.gameObject.layer != 2)
                    {
                        object[] sendArray = new object[] { hitPoints, false };
                        hit.SendMessageUpwards("ApplyDamage", sendArray, SendMessageOptions.DontRequireReceiver);
                        hit.SendMessageUpwards("Direction", transform, SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
            // Apply explosion forces to all rigidbodies
            // This needs to be in two steps for ragdolls to work correctly.
            // (Enemies are first turned into ragdolls with ApplyDamage then we apply forces to all the spawned body parts)
            colliders = Physics.OverlapSphere(explosionPosition, explosionRadius);
            foreach (var hit in colliders)
            {
                if (hit.GetComponent <Rigidbody>() && hit.gameObject.layer != LayerMask.NameToLayer("Player"))
                {
                    hit.GetComponent <Rigidbody>().AddExplosionForce(explosionPower, explosionPosition, explosionRadius, vFactor);
                }
            }
            // stop emitting particles
            if (GetComponent <ParticleEmitter>())
            {
                GetComponent <ParticleEmitter>().emit = true;
                yield return(new WaitForSeconds(0.5f));

                GetComponent <ParticleEmitter>().emit = false;
            }
            // destroy the explosion after a while
            Destroy(gameObject, explosionTimeout);
        }
Beispiel #2
0
 public void Update()
 {
     CameraShake.ShakeCam(amplitude, 10, time);
 }