我正在尝试在C#中动态添加项目到我的画布。
这是我想要做的事情
public class MyScript : MonoBehaviour
{
private List<GameObject> _buttons;
private GameObject _canvas;
public MyScript()
{
_buttons = new List<GameObject>();
}
// Use this for initialization
void Start()
{
for (int i = 0; i < 3; i++)
{
var button = Instantiate(Resources.Load("myButton", typeof(GameObject))) as GameObject;
if (button == null) continue;
button.GetComponent<RectTransform>().position = new Vector3(i, i, 0);
}
}
}
我有我的buttonPrefab,它位于Canvas中。调试后我看到我的新按钮已创建,但它们不在Canvas中,而且正常,因为我没有在代码中添加它们。关键是我不知道如何向Canvas添加新按钮。
如果按钮是GameObjects并且我无法将其转换为Button,我还可以如何添加OnClick事件?
有人可以帮助我吗?
答案 0 :(得分:1)
1-)为了在Canvas中添加新按钮你需要让你的canvas对象成为这些按钮的父对象,你需要使用setParent方法来看看这里 http://docs.unity3d.com/ScriptReference/Transform.SetParent.html
2-)对于第二个问题,您可以轻松实现只需在对象中添加一个碰撞器,然后将对象添加到对象中。并将OnMouseDown()方法添加到此脚本,每当您单击此对象时,将调用此方法。
答案 1 :(得分:1)
回答如何实例化:当这样做时,你需要记住一些事情。
但首先让我们展示一些代码:
for (int i = 0; i < 3; i++)
{
var button = (GameObject)Instantiate(Resources.Load("myButton", typeof(GameObject))) as GameObject;
if (button == null) continue;
button.transform.SetParent (referenceToCanvas.transform);
button.transform.localScale = Vector3.one;
button.transform.localRotation = Quaternion.Euler (Vector3.zero);
button.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(i, i, 0);
}
当实现GameObjects时,Unity3D会在给定比例和旋转的世界空间中创建它们。当您将画布设置为父级时,有时缩放比例将设置为零或不是您想要的。这同样适用于轮换。因此,每当我动态填充UI时,我就会添加这些代码行。
当然referenceToCanvas
是对canvas对象的引用;)
答案 2 :(得分:0)
1见Burak,请使用Transform.SetParent
。
对于2我建议创建一个空的GameObject并添加一个UI按钮,以及你需要的东西。将它作为预制件并实例化它。