Change Collider2D size at runtime
I'm trying to create a trigger collider that encapsulates all of its children. I use it to define a room, so the camera is limited to move within the room while the player is inside of it. When the player moves into the next room, I use OnTriggerEnter2D to move the camera into the new room that the player moves into.
Instead of manually sizing the collider for each room, I would like to automatically calculate it based on the colliders of the children.
Here's my code that I think should do that:
[RequireComponent(typeof(BoxCollider2D))]
public class CameraZone : MonoBehaviour
{
BoxCollider2D m_collider;
// Start is called before the first frame update
void Start()
{
m_collider = GetComponent<BoxCollider2D>();
m_collider.isTrigger = true;
Collider2D[] childColliders = GetComponentsInChildren<Collider2D>();
foreach(Collider2D child in childColliders)
{
m_collider.bounds.Encapsulate(child.bounds);
}
}
}
However, this code doesn't change the bounds of the parent collider.
This related question suggests that the problem is that Collider2D.bounds is a struct, and I need to make a copy then assign it back to the original collider after encapsulating. However, Collider2D.bounds is read only and there's no way to access the size/extents/etc. of the bounds, so that approach doesn't work. https://answers.unity.com/questions/1234063/collider-bounds-encapsulate-doesnt-seem-to-do-anyt.html
Is there any way to change the size of a Collider2D at runtime?
Answer by ahstein · Aug 25, 2020 at 09:28 PM
For anyone who comes across this, I figured out my problem.
Collider2D does not have properties for settings its size, but BoxCollider2D does. Here's the modified code to change the size of the BoxCollider2D.
[RequireComponent(typeof(BoxCollider2D))]
public class CameraZone : MonoBehaviour
{
public Bounds Bounds { get { return m_collider.bounds; } }
BoxCollider2D m_collider;
// Start is called before the first frame update
void Start()
{
m_collider = GetComponent<BoxCollider2D>();
m_collider.isTrigger = true;
Bounds bounds = m_collider.bounds;
Collider2D[] childColliders = GetComponentsInChildren<Collider2D>();
foreach(Collider2D child in childColliders)
{
bounds.Encapsulate(child.bounds);
}
m_collider.size = bounds.size;
m_collider.offset = bounds.center - m_collider.transform.position;
}
}
Your answer
Follow this Question
Related Questions
How to make flips, backflips like in game Backflip madness 2 Answers
Ground Check Issue 1 Answer
AddExplosionForce 2d workaround not working 0 Answers
Limiting backwards speed 0 Answers
2D Top-Down Platforming like Mario and Luigi: Super Star Saga 1 Answer