Missing RectTransform after creating a UI component in script

Sometimes you may create a new UI element in script and want to set it’s position etc.

I wrote a quick extension method to allow me to stretch a newly created component to that of it’s parent:

public static class Extensions
{
	public static void StretchRectTransform(this Transform value)
	{
	    RectTransform rt = value as RectTransform;
	    if (rt == null) return;
	    rt.anchorMin = Vector2.zero;
	    rt.anchorMax = Vector2.one;
	    rt.sizeDelta = Vector2.zero;
	    rt.localScale = Vector3.one;
	}
}

Which I used as follows:

   
public static void Add(GameObject sel)
{
    GameObject go = new GameObject(sel.name+"_HL");
    go.transform.SetParent(sel.transform);
    go.transform.StretchRectTransform();
    image = go.AddComponent<Image>();
}

However I quickly found that the cast of a Transform to a RectTransform did not work in this scenario, as it turns out the RectTransform does not yet exist. I’m not sure when it begins to exist however a quick look at the docs and I noticed it’s a Component so modified my function to add it if it did not exist:

public static void StretchRectTransform(this Transform value)
{
	RectTransform rt = value as RectTransform;
	if (rt == null)
	{
	    rt = value.gameObject.AddComponent<RectTransform>(); // Add a RectTransform if it does not exist
	}
	rt.anchorMin = Vector2.zero;
	rt.anchorMax = Vector2.one;
	rt.sizeDelta = Vector2.zero;
	rt.localScale = Vector3.one;
}

This now works as expected. I assume adding the RectTransform replaces the original Transform, I’ve not found any docs on this so if anyone knows better please share!

Leave a Reply