private bool FoundRaycastCollision(Vector2 direction) { if (direction == Vector2.zero) { return(false); } bool foundCollision = false; Vector3 newPosition = transform.position; Vector2[] origins = GetOrigins(direction); float distance = (Mathf.Abs((direction.x != 0f) ? velocity.x : velocity.y) * Time.fixedDeltaTime) + skinWidth; boxCol.enabled = false; for (int i = 0; i < origins.Length; i++) { RaycastHit2D hit = Physics2D.Raycast(origins[i], direction, distance, collisionMask); GizmoRay gizmoRay = new GizmoRay(origins[i], direction, distance, (direction.x != 0f) ? Color.red : Color.blue); gizmoDebugHandler.AddGizmoRay(gizmoRay); if (hit) { if (hit.distance == 0f) { continue; } if (direction.x != 0f) { velocity.x = ((hit.distance - skinWidth) * direction.x) / Time.fixedDeltaTime; } else { if (direction.y < 0f) { newPosition.y = hit.point.y; } else { newPosition.y = hit.point.y - boxCol.size.y; } // velocity.y = (hit.distance - skinWidth) / Time.fixedDeltaTime; velocity.y = 0f; } distance = hit.distance; foundCollision = true; } } boxCol.enabled = true; transform.position = newPosition; return(foundCollision); }
private Vector2[] GetOrigins(Vector2 direction) { Vector2[] points = new Vector2[(direction.x != 0f) ? Mathf.CeilToInt(boxCol.size.y / tileSize) + 1 : Mathf.CeilToInt(boxCol.size.x / tileSize) + 1]; Bounds bounds = boxCol.bounds; bounds.Expand(-skinWidth * 2f); float pointOffset = (direction.x != 0f) ? bounds.size.y / (points.Length - 1) : bounds.size.x / (points.Length - 1); Vector2 origin = (Vector2)transform.position + boxCol.offset; if (direction.x != 0f) { origin += new Vector2(Mathf.Sign(direction.x) * bounds.extents.x, -bounds.extents.y); for (int i = 0; i < points.Length; i++) { points[i] = origin + Vector2.up * (pointOffset * i); float dst = skinWidth; Color rayColor = Color.white; GizmoRay gizmoRay = new GizmoRay(points[i], Vector2.up, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.right, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.down, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.left, dst, rayColor); } } else { origin += new Vector2(-bounds.extents.x, (Mathf.Sign(direction.y) < 0f) ? -bounds.extents.y : bounds.extents.y); for (int i = 0; i < points.Length; i++) { points[i] = origin + Vector2.right * (pointOffset * i); float dst = skinWidth; Color rayColor = Color.white; GizmoRay gizmoRay = new GizmoRay(points[i], Vector2.up, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.right, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.down, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); gizmoRay = new GizmoRay(points[i], Vector2.left, dst, rayColor); gizmoDebugHandler.AddGizmoRay(gizmoRay); } } return(points); }
public void AddGizmoRay(GizmoRay ray) { rays.Add(ray); }