复制功能



每当我调用实例化函数时,它都会复制每个函数,并将每个数字加倍

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立场,永远不会改变,然后从那里-100Y

而是存储最后生成的位置,例如

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并添加按钮,而不是自己计算,它们将自动放置在彼此下方

最新更新