- Home /
Positioning UI object inside screen space
I am implementing a speech bubble in a 2D game that positions itself over a character speaking. I would like it to stay within the screen space and implemented a function for this as shown below. It does work to some degree but I am struggling with calculating the position of the Main object according to the boundaries of the child speech bubble object. The structure is as following:
Canvas
Main speech bubble Rectangle (that needs to be moved)
Bubble arrow (doesnt resize with text)
Bubble Rectangle(has bubble image and resizes according to text, used for out of camera check)
Text
And the code:
void CheckSetMenuInScreenSpace()
{
//min is left bottom of screen, max upper right corner
var screenMin = new Vector2(0, 0);
var screenMax = (Vector2)new Vector3(Screen.width, Screen.height, 0);
//tried with this, didn't work
Vector3[] corners = new Vector3[4];
bubbleRect.GetWorldCorners(corners);
//calculating boundaries (bottom left and top right) of the bubble RectTransform. not sure if I used pivot correctly in the formula
var bubbleRectMin = new Vector2(bubbleRect.transform.position.x - (bubbleRect.rect.width * bubbleRect.pivot.x), bubbleRect.transform.position.y - (bubbleRect.rect.height * bubbleRect.pivot.y));
var bubbleRectMax = new Vector2(bubbleRect.transform.position.x + (bubbleRect.rect.width * bubbleRect.pivot.x), bubbleRect.transform.position.y + (bubbleRect.rect.height * bubbleRect.pivot.y));
if (bubbleRectMin.x < screenMin.x)
{
parentRect.anchoredPosition = new Vector2(screenMin.x + (bubbleRect.rect.width / 2), parentRect.anchoredPosition.y);
var a = parentRect.rect.position;
}
else if (bubbleRectMax.x > screenMax.x)
{
parentRect.anchoredPosition = new Vector2(screenMax.x - (bubbleRect.rect.width / 2), parentRect.anchoredPosition.y);
}
if (bubbleRectMin.y < screenMin.y)
{
parentRect.anchoredPosition = new Vector2(parentRect.anchoredPosition.x, screenMin.y + (bubbleRect.rect.height / 2));
}
else if (bubbleRectMax.y > screenMax.y)
{
parentRect.anchoredPosition = new Vector2(parentRect.anchoredPosition.x, screenMax.y - (bubbleRect.rect.height / 2));
}
}
I think my problem is misunderstanding screen space, transform.position and anchored position.
Your answer
Follow this Question
Related Questions
RectTransform outline and position aren't synced 0 Answers
Convert RectTransform anchored position to other position with other anchors 0 Answers
Strange UI scrollbar handle recttransform behaviour,Cant resize clickable area on UI handle 1 Answer
Stretching 90° rotated RectTransform to the size of the Canvas 0 Answers
[SOLUTION] set UI RectTransform Anchor Presets from code c# 1 Answer