How to Instantiate a 4.6 UI Object that aligns itself on the canvas

In my scene I have an NPC that is connected to a 4.6 UI panel that shows its stats.

I want the player to make more of these NPCs and a UI panel for each. So I have set up a button on my Canvas that when i click instantiates a new NPC. That works fine but I can’t get it to instantiate a new UI as well.

This is my NPC instantiating script:

public void CreateNPC(){
 Instantiate(NPC, new Vector3(1, 1, 1), transform.rotation);
}

I have made a prefab of the UI panel that I want to instantiate and try to use something similar.

public void CreateUI(){
  Instantiate(newUI, new Vector2(40, 150), transform.rotation);
}

Where ‘newUI’ is the UI panel prefab. But although this does instantiate, it shows up blank on the canvas, not as the panel. Furthermore, if this did instantiate correctly, it would only ever appear in one location. If it is 40px wide and want each new one to exist 40px further on the x axis, how is this accomplished?

This is my first question here and I’ve tried to make it as clear as possible, if any further details are required, i’d be happy to help.

You need to SetParent to tell it where it should be.

Create a panel already on the canvas. Add a Horizontal/Vertical/Grid Layout Group to it and set the padding etc as you want.

On the prefab panel add a Layout Element and set the minimum size to your values.

The when you instantiate the panel prefab:

using UnityEngine.UI;


public RectTransform ParentPanel;  // drag you parent panel on here


//after you instantiate
NewUI.transform.SetParent(ParentPanel, false);
NewUI.transform.localScale = new Vector3(1,1,1);

Should get you closer to what you want but typed without testing so there may be typos.