public CollisionLocation Constrain3DObject(Transform objectTransform, bool collisionInfoOnly = false) { yMidPoint = new Vector3(FrustumCorners[3].x, objectTransform.position.y, FrustumCorners[3].z); xMidPoint = FrustumCorners[3] - (FrustumCorners[3] - FrustumCorners[1]).normalized * Vector3.Distance(objectTransform.position, yMidPoint); float hDist = Vector3.Distance(yMidPoint, objectTransform.position); float vDist = Vector3.Distance(xMidPoint, objectTransform.position); float hDirDot = Vector3.Dot((yMidPoint - objectTransform.position).normalized, objectTransform.right); float vDirDot = Vector3.Dot((xMidPoint - objectTransform.position).normalized, objectTransform.up); hDist *= hDirDot < 0f ? -1f : 1f; vDist *= vDirDot < 0f ? -1f : 1f; CollisionLocation location = CollisionLocation.None; if (hDist <= 0f) { if (!collisionInfoOnly) { objectTransform.position = new Vector3(yMidPoint.x, objectTransform.position.y, yMidPoint.z); } location ^= CollisionLocation.Right; } if (hDist >= HorizontalDistance) { if (!collisionInfoOnly) { objectTransform.position = new Vector3(FrustumCorners[0].x, objectTransform.position.y, FrustumCorners[0].z); } location ^= CollisionLocation.Left; } if (vDist <= 0f) { if (!collisionInfoOnly) { objectTransform.position = new Vector3(objectTransform.position.x, xMidPoint.y, objectTransform.position.z); } location ^= CollisionLocation.Top; } if (vDist >= VerticalDistance) { if (!collisionInfoOnly) { objectTransform.position = new Vector3(objectTransform.position.x, FrustumCorners[0].y, objectTransform.position.z); } location ^= CollisionLocation.Bottom; } return(location); }
public static CollisionLocation RestrictToScreenBoundary(Camera camera, Transform transform, bool collisionDataOnly = false) { if (!camera) { return(CollisionLocation.None); } CollisionLocation col = CollisionLocation.None; Vector3 viewportPos = camera.WorldToViewportPoint(transform.position); if (viewportPos.x <= 0f) { viewportPos.x = 0f; col ^= CollisionLocation.Left; } if (viewportPos.x >= 1f) { viewportPos.x = 1f; col ^= CollisionLocation.Right; } if (viewportPos.y <= 0f) { viewportPos.y = 0f; col ^= CollisionLocation.Bottom; } if (viewportPos.y >= 1f) { viewportPos.y = 1f; col ^= CollisionLocation.Top; } if (!collisionDataOnly) { transform.position = camera.ViewportToWorldPoint(viewportPos); } return(col); }