- Home /
Is there a way to make the camera collide with specific objects - 2D
Hello, I am creating a game with a strategy-based view (think europa universalis or hearts of iron). I want to know if it is possible to have the camera collide with specific objects. In my case I have multiple maps in the same scene and the player controls where the camera is directly by clicking and dragging, I do not want the player to be able to click and drag their way over to each map directly so I have put Box Collider 2D's between them, is there any way that I could make the camera collide with those Box Collider 2D's or do something similar.
Here is the camera controller script I'm using if it is useful:
private Vector3 ResetCamera;
private Vector3 Origin;
private Vector3 Diference;
private bool Drag = false;
void Start()
{
ResetCamera = Camera.main.transform.position;
}
void LateUpdate()
{
if (Input.GetMouseButton(0))
{
Diference = (Camera.main.ScreenToWorldPoint(Input.mousePosition)) - Camera.main.transform.position;
if (Drag == false)
{
Drag = true;
Origin = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
}
else
{
Drag = false;
}
if (Drag == true)
{
Camera.main.transform.position = Origin - Diference;
}
//Resets Camera position on mouse middle button click
if (Input.GetMouseButton(2))
{
Camera.main.transform.position = ResetCamera;
}
}
Answer by TheKnightsofUnity · Oct 31, 2019 at 01:00 PM
Hello @Neon_Apollo, Instead of creating box colliders between maps, I suggest to create one box collider for each map that would define its boundaries. Then after changing camera position we need to make sure that we are not out of box collider bounds. We can easily do it by clamping x,y and z position with box collider bounds max and min values. After that, you can adjust boxCollider bound to the maps dimensions.
code:
[SerializeField]
private BoxCollider mapBoundaries; //reference to BoxCollider that will define map boundaries
private Vector3 ResetCamera;
private Vector3 Origin;
private Vector3 Diference;
private bool Drag = false;
void Start()
{
ResetCamera = Camera.main.transform.position;
}
void LateUpdate()
{
if (Input.GetMouseButton(0))
{
Diference = (Camera.main.ScreenToWorldPoint(Input.mousePosition)) - Camera.main.transform.position;
if (Drag == false)
{
Drag = true;
Origin = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
}
else
{
Drag = false;
}
if (Drag == true)
{
Camera.main.transform.position = Origin - Diference;
Camera.main.transform.position = new Vector3(
Mathf.Clamp(Camera.main.transform.position.x, mapBoundaries.bounds.min.x, mapBoundaries.bounds.max.x),
Mathf.Clamp(Camera.main.transform.position.y, mapBoundaries.bounds.min.y, mapBoundaries.bounds.max.y),
Mathf.Clamp(Camera.main.transform.position.z, mapBoundaries.bounds.min.z, mapBoundaries.bounds.max.z));
}
//Resets Camera position on mouse middle button click
if (Input.GetMouseButton(2))
{
Camera.main.transform.position = ResetCamera;
}
}
Thanks! Works wonderfully. I'll add for anyone that might have this problem in the future to make sure the collider object has the same Z position as the camera, as that caused a slight visual problem for me.
Your answer
Follow this Question
Related Questions
Camera bounce/collision 1 Answer
The tilemap collider is simply not working 0 Answers
How to use OverlapCollider? 1 Answer