// 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(); }
// 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); }
// 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); } }