private void Update() { Damageable.DamageMessage data = new Damageable.DamageMessage { damageSource = transform.position, amount = 1, damager = this, stopCamera = false, throwing = true }; int count = Physics.OverlapSphereNonAlloc(transform.position, m_Collider.radius * transform.localScale.x, sOverlapCache, m_PlayerMask); for (int i = 0; i < count; ++i) { Damageable d = sOverlapCache[i].GetComponent <Damageable>(); if (d != null) { data.direction = d.transform.position - transform.position; d.ApplyDamage(data); } } }
private bool CheckDamage(Collider other, AttackPoint pts) { Damageable damageable = other.GetComponent <Damageable>(); if (damageable == null) { return(false); } if (damageable.gameObject == m_Owner) { return(true); //ignore self harm, but do not end the attack (we don't "bounce" off ourselves) } if ((targetLayers.value & (1 << other.gameObject.layer)) == 0) { //hit an object that is not in our layer, this end the attack. we "bounce" off it return(false); } if (hitAudio != null) { var renderer = other.GetComponent <Renderer>(); if (!renderer) { renderer = other.GetComponentInChildren <Renderer> (); } if (renderer) { hitAudio.PlayRandomClip(renderer.sharedMaterial); } else { hitAudio.PlayRandomClip(); } } Damageable.DamageMessage data = new Damageable.DamageMessage { amount = damage, damager = this, direction = m_Direction.normalized, damageSource = m_Owner.transform.position, throwing = m_IsThrowingHit, stopCamera = false }; damageable.ApplyDamage(data); if (hitParticlePrefab != null) { m_ParticlesPool[m_CurrentParticle].transform.position = pts.attackRoot.transform.position; m_ParticlesPool[m_CurrentParticle].time = 0; m_ParticlesPool[m_CurrentParticle].Play(); m_CurrentParticle = (m_CurrentParticle + 1) % PARTICLE_COUNT; } return(true); }
public void BeHit(int decHP, ICreatureBehavior source) { var msg = new Damageable.DamageMessage() { amount = decHP, damager = this, direction = Vector3.up, stopCamera = false }; m_damageable.ApplyDamage(msg); }
public void Explosion() { if (explosionPlayer) { explosionPlayer.transform.SetParent(null); explosionPlayer.PlayRandomClip(); } int count = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, m_ExplosionHitCache, damageMask.value); Damageable.DamageMessage message = new Damageable.DamageMessage { amount = damageAmount, damageSource = transform.position, damager = this, stopCamera = false, throwing = true }; for (int i = 0; i < count; ++i) { Damageable d = m_ExplosionHitCache[i].GetComponentInChildren <Damageable>(); if (d != null) { d.ApplyDamage(message); } } pool.Free(this); Vector3 playPosition = transform.position; Vector3 playNormal = Vector3.up; if (vfxOnGround) { RaycastHit hit; if (Physics.Raycast(transform.position, Vector3.down, out hit, 100.0f, m_EnvironmentLayer)) { playPosition = hit.point + hit.normal * 0.1f; playNormal = hit.normal; } } m_VFXInstance.gameObject.transform.position = playPosition; m_VFXInstance.gameObject.transform.up = playNormal; m_VFXInstance.time = 0.0f; m_VFXInstance.gameObject.SetActive(true); m_VFXInstance.Play(true); }
public void BeHit(int decHP, ICreatureBehavior source) { m_Animator.SetTrigger(m_HashHurt); // Find the direction of the damage. Vector3 forward = source.GetTransform().position - transform.position; forward.y = 0f; Vector3 localHurt = transform.InverseTransformDirection(forward); // Set the HurtFromX and HurtFromY parameters of the animator based on the direction of the damage. m_Animator.SetFloat(m_HashHurtFromX, localHurt.x); m_Animator.SetFloat(m_HashHurtFromY, localHurt.z); var msg = new Damageable.DamageMessage() { amount = decHP, damager = this, direction = Vector3.up, stopCamera = false }; m_Damageable.ApplyDamage(msg); if (IsMine) { // Shake the camera. CameraShake.Shake(CameraShake.k_PlayerHitShakeAmount, CameraShake.k_PlayerHitShakeTime); // Play an audio clip of being hurt. if (hurtAudioPlayer != null) { hurtAudioPlayer.PlayRandomClip(); } if (m_healthUI != null) { m_healthUI.ChangeHitPointUI(m_Damageable); } } }
public void Explosion() { if (explosionPlayer) { explosionPlayer.transform.SetParent(null); explosionPlayer.PlayRandomClip(); } int count = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, m_ExplosionHitCache, damageMask.value); Damageable.DamageMessage message = new Damageable.DamageMessage { amount = damageAmount, damageSource = transform.position, damager = this, stopCamera = false, throwing = true }; for (int i = 0; i < count; ++i) { Damageable d = m_ExplosionHitCache[i].GetComponentInChildren <Damageable>(); if (d != null) { d.ApplyDamage(message); } } pool.Free(this); m_VFXInstance.gameObject.transform.position = transform.position; m_VFXInstance.time = 0.0f; m_VFXInstance.gameObject.SetActive(true); m_VFXInstance.Play(true); }
private void OnTriggerStay(Collider other) { if ((damagedLayers.value & 1 << other.gameObject.layer) == 0) { return; } Damageable d = other.GetComponentInChildren <Damageable>(); if (d != null && !d.isInvulnerable) { Damageable.DamageMessage message = new Damageable.DamageMessage { damageSource = transform.position, damager = this, amount = amount, direction = (other.transform.position - transform.position).normalized, throwing = false }; d.ApplyDamage(message); } }