void Start() { m_BoxCollider = GetComponent <BoxCollider2D>(); m_RaycastOrigins = new RaycastOrigins(); CalculateRaySpacing(); }
// Use this for initialization void Start() { controller = GetComponent <Controller2D>(); rb = GetComponent <Rigidbody2D>(); origins = new RaycastOrigins(); controller.status.facingDirection = 1; }
protected override void OnUpdate() { float deltaTime = Time.deltaTime; foreach (CollisionFilter entity in GetEntities <CollisionFilter>()) { Movement movement = entity.MovementComponent; Collision collisionData = entity.CollisionComponent; BoxCollider2D collider = entity.ColliderComponent; ResetCollisionState(collisionData); float2 movementDelta = movement.Value; RaycastOrigins rayOrigins = CalculateRaycastOrigins(collisionData, collider); float2 raySpacing = CalculateRaySpacing(collisionData, collider); if (movementDelta.x != 0) { HandleHorizontalCollisions(ref movementDelta, collisionData, rayOrigins, raySpacing.x); } if (movementDelta.y != 0) { HandleVerticalCollisions(ref movementDelta, collisionData, rayOrigins, raySpacing.y); } movement.Value = movementDelta; } }
void Start() { controller = GetComponent <Controller2D>(); powerupController = GetComponent <PowerupController>(); ball = GameObject.FindGameObjectWithTag("Ball").GetComponent <Rigidbody2D>(); raycastOrigins = new RaycastOrigins(); seeker = GetComponent <Seeker>(); }
public void CalculateBounds() { colliderBounds = col.bounds; colliderBounds.Expand(-skinWidth * 2); raycastOrigins = new RaycastOrigins(); raycastOrigins.topLeft = new Vector2(colliderBounds.min.x, colliderBounds.max.y); raycastOrigins.topRight = new Vector2(colliderBounds.max.x, colliderBounds.max.y); raycastOrigins.bottomLeft = new Vector2(colliderBounds.min.x, colliderBounds.min.y); raycastOrigins.bottomRight = new Vector2(colliderBounds.max.x, colliderBounds.min.y); }
public static void UpdateRayOrigins(BoxCollider2D collider, float inset, ref RaycastOrigins origins) { Bounds insetBounds = collider.bounds; insetBounds.Expand(-2f * inset); origins.topLeft = new Vector2(insetBounds.min.x, insetBounds.max.y); origins.bottomLeft = insetBounds.min; origins.bottomRight = new Vector2(insetBounds.max.x, insetBounds.min.y); }
void UpdateRaycastPositions() { Bounds bounds = boxCollider.bounds; bounds.Expand(skinWidth * -2); origins = new RaycastOrigins(); origins.topleft = new Vector2(bounds.min.x, bounds.min.y); origins.topright = new Vector2(bounds.max.x, bounds.min.y); origins.bottomleft = new Vector2(bounds.min.x, bounds.max.y); origins.bottomright = new Vector2(bounds.max.x, bounds.max.y); }
private RaycastOrigins CalculateRaycastOrigins(Collision collisionData, BoxCollider2D collider) { Bounds bounds = collider.bounds; bounds.Expand(collisionData.SkinWidth * -2f); RaycastOrigins origins = new RaycastOrigins(); origins.TopLeft = new Vector2(bounds.min.x, bounds.max.y); origins.TopRight = bounds.max; origins.BottomLeft = bounds.min; origins.BottomRight = new Vector2(bounds.max.x, bounds.min.y); return(origins); }
private void HandleVerticalCollisions(ref float2 movementDelta, Collision collisionData, RaycastOrigins rayOrigins, float raySpacing) { float direction = math.sign(movementDelta.y); float rayDistance = math.abs(movementDelta.y) + collisionData.SkinWidth; Vector2 rayOrigin = (direction == -1) ? rayOrigins.BottomLeft : rayOrigins.TopLeft; for (int i = 0; i < collisionData.VerticalRayCount; i++) { Vector2 ray = rayOrigin + (Vector2.right * (raySpacing * i + movementDelta.x)); Debug.DrawRay(ray, Vector2.up * direction * rayDistance, Color.red, 0.1f); RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.up * direction, rayDistance, collisionData.Mask); if (hit) { movementDelta.y = (hit.distance - collisionData.SkinWidth) * direction; rayDistance = hit.distance; collisionData.State.above = (direction == 1); collisionData.State.below = (direction == -1); } } }
private void HandleHorizontalCollisions(ref float2 movementDelta, Collision collisionData, RaycastOrigins rayOrigins, float raySpacing) { float direction = math.sign(movementDelta.x); float rayDistance = math.abs(movementDelta.x) + collisionData.SkinWidth; Vector2 rayOrigin = (direction == -1) ? rayOrigins.BottomLeft : rayOrigins.BottomRight; for (int i = 0; i < collisionData.HorizontalRayCount; i++) { Vector2 ray = rayOrigin + (Vector2.up * raySpacing * i); Debug.DrawRay(ray, Vector2.right * direction * rayDistance, Color.red); RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.right * direction, rayDistance, collisionData.Mask); if (hit) { // Slope Handling float slopeAngle = Vector2.Angle(hit.normal, Vector2.up); if (i == 0 && slopeAngle <= MAX_CLIMB_ANGLE) { float distanceToSlopeStart = 0; if (slopeAngle != collisionData.State.slopeAngle) { distanceToSlopeStart = hit.distance - collisionData.SkinWidth; movementDelta.x -= distanceToSlopeStart; } HandleVerticalSlope(ref movementDelta, collisionData, slopeAngle); movementDelta.x += distanceToSlopeStart * direction; } else { movementDelta.x = (hit.distance - collisionData.SkinWidth) * direction; rayDistance = hit.distance; collisionData.State.right = (direction == 1); collisionData.State.left = (direction == -1); } } } }
// Unity // ===================================================================== private void Awake() { collider = GetComponent <BoxCollider2D>(); raycastOrigins = new RaycastOrigins(); }
private void AssignRaycastOrigins(Bounds bounds) { RaycastOrigins.AssignBounds(bounds); }