每当我调用 Instantiate 函数时,它都会用它复制每个函数并将每个数字加倍
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
而不是自己计算。只需添加您的按钮,它们就会自动放置在彼此下方
关于c# - 复制功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66764539/