- Home /
Question by
Kennyist · Mar 06, 2018 at 10:06 PM ·
camerashadercamera-movementuser interfacecamera viewport
Keep camera perfectly in box and scaled to fit view
I have a scroll view with content the same size as the game area, when this scrolls a top down view camera will scroll along the game area to match the scroll view position. From this i want the camera to match the size of the content currently in the scroll view and not go over the edge.
So if the scroll view has 800x600px in view, the top down camera should be zoomed to show 800x600px from the ground level. And if scrolled to the edge, should not show anything over it.
I currently have the scroll view and camera moving but i cannot get it to fit in the box while also having the correct zoom level
(Current bottomLeft is 0,0 and topRight is 2000,3000)
void OnScroll(Vector2 position)
{
/*
Vector3 newPos = new Vector3();
Vector2 mapSize = GetMapSize();
newPos.x = (mapSize.x - Screen.width) * position.x;
newPos.z = (mapSize.y - Screen.height) * position.y;
newPos.x += Screen.width / 2;
newPos.y = 680;
newPos.z += Screen.height / 2;
camera.transform.position = newPos;
*/
Vector3 newPos = new Vector3();
Vector2 mapSize = GetMapSize();
newPos = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, 0, Screen.height / 2));
newPos.x += mapSize.x * position.x;
newPos.y = 600;
newPos.z += mapSize.y * position.y;
camera.transform.position = newPos;
}
Vector2 GetMapSize()
{
Vector2 size = new Vector2();
// Width
if (bottomLeft.x < 0 && topRight.x < 0)
{
size.x = Mathf.Abs(bottomLeft.x) - Mathf.Abs(topRight.x);
}
else if (bottomLeft.x < 0)
{
size.x = Mathf.Abs(bottomLeft.x) + topRight.x;
}
else
{
size.x = topRight.x - bottomLeft.x;
}
// height
if (bottomLeft.y < 0 && topRight.y < 0)
{
size.y = Mathf.Abs(bottomLeft.y) - Mathf.Abs(topRight.y);
}
else if (bottomLeft.y < 0)
{
size.y = Mathf.Abs(bottomLeft.y) + topRight.y;
}
else
{
size.y = topRight.y - bottomLeft.y;
}
return size;
}
Comment