static bool CanUse(Vector3 position, Rigidbody2D body, ExplosionForce2DMode mode) { if (mode == ExplosionForce2DMode.Simple) { return(true); } RaycastHit2D hit = Physics2D.Linecast(position, body.position); if (hit.rigidbody != null && hit.rigidbody == body) { return(true); } return(false); }
/// <summary> /// Эффект взрыва для 2D игры. /// </summary> /// <param name="explosionForce">Сила взрыва.</param> /// <param name="explosionPosition">Точка взрыва.</param> /// <param name="explosionRadius">Радиус взрыва.</param> /// <param name="mode">Режим эффекта. Simple - не учитывает преграды. Adaptive - учитывает окружение.</param> /// <param name="layerMask">Фильтр по маске слоя.</param> public static void AddExplosionForce2D(float explosionForce, Vector3 explosionPosition, float explosionRadius, ExplosionForce2DMode mode = ExplosionForce2DMode.Simple, int layerMask = Physics2D.AllLayers) { Collider2D[] colliders = Physics2D.OverlapCircleAll(explosionPosition, explosionRadius, layerMask); foreach (Collider2D hit in colliders) { if (hit.attachedRigidbody != null) { Vector3 direction = hit.transform.position - explosionPosition; direction.z = 0; if (CanUse(explosionPosition, hit.attachedRigidbody, mode)) { hit.attachedRigidbody.AddForce(direction.normalized * explosionForce); } } } }