每当我调用实例化函数时,它都会复制每个函数,并将每个数字加倍
private Button[] Checks;
public GameObject tni;//TextAndInput
public int Coins;
public TMPro.TextMeshProUGUI Score;
private void Start()
{
Checks = GetComponentsInChildren<Button>();
foreach(Button button in Checks)
{
button.onClick.AddListener(Add);
}
}
private void Update()
{
Score.SetText(Coins.ToString());
if (Input.GetKeyDown(KeyCode.Space))
{
Duplicate();
}
}
public void Add()
{
Coins++;
}
public void Duplicate()
{
GameObject duplicate = GameObject.Instantiate(tni);
duplicate.transform.position=new Vector3(tni.transform.position.x, tni.transform.position.y-100, tni.transform.position.z);
duplicate.transform.SetParent(GameObject.FindGameObjectWithTag("Canvas").transform, false);
Button ButtonDuplicate = GetComponentInChildren<Button>();
ButtonDuplicate.onClick.AddListener( () => Add() );
}
** 例如,add 函数在第一个按钮上添加 2,在复制的按钮上添加 1。 当我复制按钮时,它将首先复制 1 按钮,然后 如果我再次复制,它将复制另外 2 个按钮,所以现在它们是 4 个按钮和 如果我再次复制它们,它们将是 8 个,依此类推 如果您知道如何解决它,请告诉我 **
问题线似乎是
Button ButtonDuplicate = GetComponentInChildren<Button>();
您总是在同一个对象(此脚本附加到的对象)上执行此操作,因此
ButtonDuplicate.onClick.AddListener( () => Add() );
始终为在此对象的子对象中找到的第一个按钮向Add
添加一个额外的回调。
在我看来,你更想做
Button ButtonDuplicate = duplicate.GetComponentInChildren<Button>();
为了获取您刚刚生成的按钮组件。
<小时 />更新
对职位的评论
在
duplicate.transform.position=new Vector3(tni.transform.position.x, tni.transform.position.y-100, tni.transform.position.z);
你总是采取相同的tni
立场,永远不会改变,然后从那里-100
Y
。
而是存储最后生成的位置,例如
private Vector3 currentSpawnPos;
private void Start ()
{
...
currentSpawnPos = tni.transform.position - Vector3.up * 100;
}
public void Duplicate()
{
...
duplicate.transform.position=new Vector3(currentSpawnPos);
currentSpawnPos -= Vector3.up * 100;
...
}
或者实际上,您可以使用VerticalLayoutGroup
并添加按钮,而不是自己计算,它们将自动放置在彼此下方