public override void HandleCollision(Collider collider, Collision collision) { if (shootInstigator == collider.gameObject) { return; } GameObject hitObject = collider.gameObject; DamageableEntity hitDamageableEntity = hitObject.GetComponent <DamageableEntity>(); if (hitDamageableEntity) { if (hitDamageableEntity.GetDamageTag != damageTag && damageTag != DamageTag.Environment) { hitDamageableEntity.ReceiveDamage(projectileDamages, gameObject); } } else { AudioManager.PlaySound(defaultDestroySound); } DestroyProjectile(); }
public void HandleCollision(RaycastHit hit, Vector3 initialMovementDirection) { InterruptTrajectory(); DemandeFx(hit.point); if (hit.collider.gameObject.layer == 12) { SoundManager.Instance.PlaySound(Sound.ShieldGetHit, hit.transform.position); FxManager.Instance.CreateFx(FxType.genericImpact, hit.point); } else if (hit.collider.gameObject.layer == 14) { SoundManager.Instance.PlaySound(Sound.WallGetHit, hit.transform.position); FxManager.Instance.CreateFx(FxType.genericImpact, hit.point); } Vector3 horizontalNormal = hit.normal; horizontalNormal.y = 0; horizontalNormal.Normalize(); // Place disc as close from the hit point as possible Vector3 newPos = hit.point + horizontalNormal * (myCollider.radius + 0.01f); newPos.y = 0; transform.position = newPos; // Gives the disc a knockback to simulate a rebound Vector3 reflectedDirection = Vector3.Reflect(initialMovementDirection, horizontalNormal); knockbackSystem.ReceiveKnockback(DamageTag.Environment, GetReboundOnObjectKnockback(), reflectedDirection); DamageableEntity hitDamageableEntity = hit.collider.GetComponent <DamageableEntity>(); if (hitDamageableEntity != null) { hitDamageableEntity.ReceiveDamage(damageTag, new DamagesParameters(currentDamagesAmount, numberOfStunedTurns)); lastObjTouch = hitDamageableEntity.gameObject; SoundManager.Instance.PlaySound(Sound.EnemyDamaged, hitDamageableEntity.transform.position); } if (effectZoneToInstantiateOnHit != EffectZoneType.None) { EffectZone newEffectZone = EffectZonesManager.Instance.GetEffectZoneFromPool(effectZoneToInstantiateOnHit); newEffectZone.StartZone(GetColliderCenter); if (destroyOnHit) { DiscManager.Instance.DestroyDisc(this); } } }
/// <summary> /// Returns true if something was hit, and therefore the movement needs to stop /// </summary> /// <param name="startPosition"></param> /// <param name="endPos"></param> /// <returns></returns> public bool TryToMoveFromTo(Vector3 startPosition, Vector3 endPos) { Vector3 direction = endPos - startPosition; float distance = direction.magnitude; direction.Normalize(); startPosition += myCollider.center; endPos += myCollider.center; RaycastHit hit = new RaycastHit(); if (Physics.SphereCast(startPosition, myCollider.radius, direction, out hit, distance, GetTrajectoryCheckLayerMask)) { if (hit.collider.gameObject.layer != 10 || blockedByEnemies) { // test bouclier if (hit.collider.gameObject.layer == 12) { Transform hitParent = hit.transform.parent; if (hitParent != null) { ShieldManager objShielManager = hit.transform.parent.GetComponent <ShieldManager>(); if (objShielManager != null) { if (objShielManager.myObjParent == lastObjTouch) { return(false); } } } } HandleCollision(hit, direction); return(true); } else { DamageableEntity hitDamageableEntity = hit.collider.GetComponent <DamageableEntity>(); if (hitDamageableEntity != null) { hitDamageableEntity.ReceiveDamage(damageTag, new DamagesParameters(currentDamagesAmount, numberOfStunedTurns)); lastObjTouch = hitDamageableEntity.gameObject; } } } return(false); }
public override void HandleCollision(Collider collider, Collision collision) { GameObject hitObject = collider.gameObject; if (shootInstigator == hitObject) { return; } bool mustDestroy = false; bool preventDestroyOnWall = false; ProjectileBase hitProjectile = hitObject.GetComponent <ProjectileBase>(); if (hitProjectile) { preventDestroyOnWall = true; } if (!preventDestroyOnWall && collision != null) { Vector3 averageNormal = Vector3.zero; ContactPoint[] points = collision.contacts; foreach (ContactPoint point in points) { averageNormal += point.normal; } averageNormal /= points.Length; if (Mathf.Abs(Vector3.Dot(averageNormal, Vector3.up)) < 0.5f) { mustDestroy = true; } } DamageableEntity hitDamageableEntity = hitObject.GetComponent <DamageableEntity>(); if (hitDamageableEntity) { if (hitDamageableEntity.GetDamageTag != damageTag && damageTag != DamageTag.Environment) { hitDamageableEntity.ReceiveDamage(projectileDamages, gameObject); } mustDestroy = true; } if (mustDestroy) { DestroyProjectile(); } }
void CollisionAttack() { List <GameObject> _objsTouched = GetListOfObjsTouched(); foreach (GameObject _obj in _objsTouched) { DamageableEntity hitDamageableEntity = _obj.GetComponent <DamageableEntity>(); if (hitDamageableEntity != null && hitDamageableEntity.gameObject != player) { hitDamageableEntity.ReceiveDamage(DamageTag.Enemy, new DamagesParameters(damage)); } } }
public void CastEffectZone() { Collider[] hitColliders = Physics.OverlapSphere(transform.position, currentRadius, effectMask); foreach (Collider hitCollider in hitColliders) { if (alreadyHitColliders.Contains(hitCollider)) { continue; } alreadyHitColliders.Add(hitCollider); if (damaging) { DamageableEntity hitDamageable = hitCollider.GetComponent <DamageableEntity>(); if (hitDamageable != null) { hitDamageable.ReceiveDamage(sourceTag, new DamagesParameters(damageAmount, numberOfStunedTurns)); } } if (knockbacking) { KnockbackableEntity hitKnockable = hitCollider.GetComponent <KnockbackableEntity>(); if (hitKnockable != null) { Vector3 hitPosition = hitCollider.transform.position; Vector3 knockbackDirection = hitCollider.transform.position - transform.position; knockbackDirection.y = 0; knockbackDirection.Normalize(); hitKnockable.ReceiveKnockback(sourceTag, GetKnockbackParametersWithDistance(hitPosition), knockbackDirection); } } } }