private Vector2 SetVelocityBasedOnCollisionType(CollisionType colType, CollisionSide colSide, ICollider collidingObject, float endSpeed, Vector2 actualVelocity) { switch (colType) { case CollisionType.Frame: case CollisionType.Enemy: return(SetVelocity(colSide, endSpeed, LastFrameVelocity)); case CollisionType.Ship: return(SetVelocity(colSide, endSpeed, actualVelocity)); case CollisionType.StrikerLeft: case CollisionType.StrikerRight: Striker striker = collidingObject as Striker; Vector2 vel = striker.GetForceOnBallHit(this, colSide); Rigidbody.velocity = vel; return(vel); default: return(Vector2.zero); } }
public List <IRayCollider> HandleCollision(List <IRayCollider> collidersToSkip) { if (skipOneFrameFromCollisionSystem) { return(new List <IRayCollider>()); } List <IRayCollider> collidedWith = new List <IRayCollider>(); Vector2 direction = currentCenterPoint - LastFrameCenterPoint; float distanceForRay = direction.magnitude; float radius = Collider.radius / 2; int safe = 0; while (rayHits.Length > 0 && distanceForRay > 0) { rayHits.SortByLength(); if (rayHits.Length > 1) { for (int i = 0; i < rayHits.Length; i++) { //Debug.LogWarningFormat("[{0}] point: {1} centroid: {2} length: {3}", i, rayHits[i].point, rayHits[i].centroid, rayHits[i].distance); } } RaycastHit2D rayHit = rayHits[0]; CollisionSide colSide = CollisionSide.Bottom; if (rayHit.collider.CompareTag(GameTags.Frame)) { FrameCollider frameCollider = rayHit.collider.GetComponent <FrameCollider>(); IRayCollider col = frameCollider as IRayCollider; if (!collidersToSkip.Contains(col)) { if (frameCollider.DestroyBallAndProjectiles) { GameController.Instance.RemoveBallFromPlay(this); } else { colSide = frameCollider.CollisionSide; OnCollision(this, rayHit, colSide, CollisionType.Frame, defaultToTotalDistance, LastFrameVelocity.magnitude, safe, frameCollider, out distanceForRay); } if (!collidedWith.Contains(col)) { collidedWith.Add(col); } } } else if (rayHit.collider.CompareTag(GameTags.Enemy)) { // Debug.DrawLine(currentCenterPoint, LastFrameCenterPoint, Color.green, 2); EnemyBase enemy = rayHit.collider.GetComponent <EnemyBase>(); IRayCollider col = enemy as IRayCollider; if (!collidersToSkip.Contains(col)) { colSide = CollisionSideDetect.GetCollisionSide(rayHit.centroid, rayHit.point); OnCollision(this, rayHit, colSide, CollisionType.Enemy, defaultToTotalDistance, PhysicsConstants.BallSpeedAfterEnemyHit, safe, enemy, out distanceForRay); enemy.OnCollisionWithBall(this); if (!collidedWith.Contains(col)) { collidedWith.Add(col); } } } else if (rayHit.collider.CompareTag(GameTags.Ship)) { ShipCollider ship = rayHit.collider.GetComponent <ShipCollider>(); IRayCollider col = ship as IRayCollider; if (!collidersToSkip.Contains(col)) { colSide = ship.GetCollisionSideWithBall(this, LastFrameCenterPoint); OnCollision(this, rayHit, colSide, CollisionType.Ship, defaultToTotalDistance, PhysicsConstants.BallSpeedAfterShipHit, safe, ship, out distanceForRay); } if (!collidedWith.Contains(col)) { collidedWith.Add(col); } } else if (rayHit.collider.CompareTag(GameTags.Striker)) { Striker striker = rayHit.collider.GetComponent <Striker>(); IRayCollider col = striker as IRayCollider; if (!collidersToSkip.Contains(col)) { colSide = striker.GetCollisionSideWithBall(LastFrameCenterPoint); OnCollision(this, rayHit, colSide, striker.CollisionType, defaultToTotalDistance, striker.GetForceOnBallHit(this, colSide).magnitude, safe, striker, out distanceForRay); } if (!collidedWith.Contains(col)) { collidedWith.Add(col); } } //Debug.LogFormat("{0} collision with {1} on side {2}", safe, rayHit.collider.gameObject.name, colSide); safe++; } return(collidedWith); }
private Vector2 GetPositionOnStrikerHit(CollisionSide colSide, ICollider collidingObject, Vector2 centroidPoint, Vector2 velocity, float distanceAfterHit) { Striker striker = collidingObject as Striker; return(centroidPoint + striker.GetForceOnBallHit(this, colSide).normalized *distanceAfterHit); }