示例#1
0
        // FinalStageShooting
        protected override void FinalStageShooting()
        {
            RaycastHit hitInfo;

            if (Physics.SphereCast(projectileOuter.position, swayRadius, projectileOuter.forward, out hitInfo, swayRange, hitMask))
            {
                Collider hitCollider = hitInfo.collider;
                if (hitCollider.isTrigger)
                {
                    return;
                }

                IDamageHandler handler = hitCollider.GetComponent <IDamageHandler>();
                if (handler != null)
                {
                    handler.TakeDamage(new DamageInfo(damage, projectileOuter.root, owner, EDamageType.Melee));
                }

                HitEffect.SpawnHitEffect(hitEffect, hitInfo);

                Rigidbody tmpRb = hitCollider.attachedRigidbody;
                if (tmpRb != null && !tmpRb.isKinematic)
                {
                    tmpRb.AddForce(projectileOuter.forward * (hitForce * 1.75f / (tmpRb.mass > 1f ? tmpRb.mass : 1f)), ForceMode.Impulse);
                }
            }

            base.FinalStageShooting();
        }
示例#2
0
        // Explode
        private void Explode(ICharacter owner)
        {
            if (exploded)
            {
                return;
            }

            exploded = true;

            Transform m_Transform = transform;

            if (fragments != null)
            {
                fragments.SpawnCopy(m_Transform.position, m_Transform.rotation);
            }

            Collider m_Collider = GetComponent <Collider>();

            Collider[] overlapColliders = Physics.OverlapSphere(m_Transform.position, radius, hitMask);

            Vector3    direction = Vector3.zero;
            RaycastHit hitInfo;
            DamageInfo damageInfo = new DamageInfo();

            foreach (Collider hitCollider in overlapColliders)
            {
                if (hitCollider == m_Collider || hitCollider.isTrigger)
                {
                    continue;
                }

                direction = hitCollider.bounds.center - m_Transform.position;

                if (Physics.Raycast(m_Transform.position, direction, out hitInfo, radius, hitMask) == false || hitCollider != hitInfo.collider)
                {
                    continue;
                }

                float distance = Vector3.Distance(m_Transform.position, hitInfo.point);
                float percent  = (100f - (distance / radius * 100f)) / 100f;

                IDamageHandler handler = hitCollider.GetComponent <IDamageHandler>();
                if (handler != null)
                {
                    handler.TakeDamage(damageInfo.GetItByInfo(damage * percent, m_Transform, owner, EDamageType.Explosion));

                    if (handler.isPlayer)
                    {
                        PlayerCamera.Shake(percent / 2f, percent);
                    }
                }

                Rigidbody tmpRb = hitCollider.attachedRigidbody;
                if (tmpRb != null && tmpRb.isKinematic == false)
                {
                    percent *= 1.75f;
                    tmpRb.AddExplosionForce(force * percent / (tmpRb.mass > 1f ? tmpRb.mass : 1f), m_Transform.position, radius, upwardsModifier, ForceMode.Impulse);
                }
            }


            float lifetime = 0f;


            // Play SFX
            AudioSource m_Audio = GetComponent <AudioSource>();

            if (m_Audio != null)
            {
                m_Audio.SetupForSFX();

                AudioClip sfxClip = Audio.GetRandomClip(explosionSounds);
                m_Audio.PlayOneShot(sfxClip);

                if (sfxClip != null)
                {
                    lifetime = Mathf.Max(lifetime, sfxClip.length);
                }
            }
            else
            {
                Audio.PlayClipAtPoint(Audio.GetRandomClip(explosionSounds), m_Transform.position);
            }


            // Spawn FX
            ParticleSystem explosionFX = GetComponent <ParticleSystem>();

            if (explosionFX != null)
            {
#if UNITY_5_4_PLUS
                var main = explosionFX.main;
                main.playOnAwake = main.loop = false;
                float startLifetime = main.startLifetime.constant;
#else
                explosionFX.playOnAwake   = explosionFX.loop = false;
                explosionFX.playbackSpeed = Time.timeScale;
                float startLifetime = explosionFX.startLifetime;
#endif
                explosionFX.Play();

                lifetime = Mathf.Max(lifetime, startLifetime);
            }


            Destroy(gameObject.MoveToCache(), lifetime);
        }
示例#3
0
        // Impact
        private void Impact()
        {
            movement     = false;
            nextPosition = hitInfo.point;

            if (IsExplosionObject())
            {
                return;
            }

            m_Transform.position = nextPosition;

            bool showHitTexture = (subType == EProjectileSubType.Bullet);

            IDamageHandler handler = hitInfo.collider.GetComponent <IDamageHandler>();

            if (handler != null)
            {
                handler.TakeDamage(new DamageInfo(damage, m_Transform, owner, EDamageType.Impact));
                showHitTexture = (handler.isPlayer == false && handler.isNPC == false);
            }

            HitEffect.SpawnHitEffect(decalObject, hitInfo, showHitTexture);

            Rigidbody tmpRb = hitInfo.collider.attachedRigidbody;

            if (tmpRb != null && tmpRb.isKinematic == false)
            {
                tmpRb.AddForce(m_Transform.forward * ((damage / 10f) * (damage * 20f) / 100f / (tmpRb.mass > 1f ? tmpRb.mass : 1f)), ForceMode.Impulse);
            }


            if (subType == EProjectileSubType.Arrow)
            {
                Collider tmpCollider = GetComponent <Collider>();
                if (tmpCollider == null)
                {
                    Debug.LogWarning("Collider is not found! Projectile(Arrow) has been destroyed! Warning in " + this.name);
                    Destroy(gameObject);
                    return;
                }

                tmpCollider.enabled = true;
                tmpRb = tmpCollider.attachedRigidbody;

                if (type == EProjectileType.Ballistic && tmpRb != null)
                {
                    tmpRb.velocity    = Vector3.zero;
                    tmpRb.useGravity  = false;
                    tmpRb.isKinematic = true;
                    tmpRb.Sleep();
                }

                Pickup tmpPickup = GetComponent <Pickup>();

                if (tmpPickup != null)
                {
                    tmpPickup.enabled = true;
                }

                m_Transform.SetParent(hitInfo.transform);
            }
            else
            {
                Destroy(gameObject);
            }
        }