For my UIs there is this chain of hierarchy created as follow
Emptypanel contains a script that creates UI_A at runtime and parent UI_A to itself
GameObject UI_A= Instantiate(g);
UI_A.transform.position = transform.position;
UI_A.transform.SetParent(transform);
UI_A.transform.localScale = transform.localScale;
UI_A also contain a script that create UI_B which will attach itself to UI_A
//script in UI_A
void Start () {
//float width = GetComponent<RectTransform>().rect.width;
//float height = GetComponent<RectTransform>().rect.height;
Vector3 pos = transform.position;
pos += new Vector3(offsetFromEdge.x, offsetFromEdge.y, 0f);
_UI_B = new UI_B(transform, pos);
}
and in UI_B constructor:
public UI_B(Transform parent, Vector3 pos)
{
GameObject obj = new GameObject();
obj.AddComponent<Canvas>();
var comp = obj.GetComponent<RectTransform>();
comp.pivot = Vector2.zero;
comp.anchorMin = Vector2.zero;
comp.anchorMax = Vector2.zero;
obj.transform.position = pos;
obj.SetParent(parent);
obj.localScale = scale;
}
So, when offsetFromEdge is (0,0), UI_B appear nice at where it should be, right on top of UI_A with localPosition being (0,0,0). However when i set the value of offsetFromEdge to (1,1), UI_B localposition become insanely huge (3611.xx, 3611.xx, 0);
These values are displayed on the RectTransform component's Pos X and Pos Y which i believe is the same a UI_B's transform.localPosition.
I have no idea what causes this behavior.
You are setting world position of the game object first then changing its parent, that's why you are not getting desired position. You should set the parent first then set the position by transform.localposition.