Cada vez que llamo a la función Instanciar, duplica cada función con ella y duplica cada número
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() ); }** Por ejemplo, la función de agregar suma 2 en el primer botón y 1 en el botón duplicado. y cuando duplique los botones duplicará primero el botón 1 luego cuando duplique de nuevo duplicará otros 2 entonces ahora son 4 botones y si los duplico de nuevo serán 8 y así sucesivamente si saben cómo solucionarlo Por favor dígame **
La línea problemática parece ser
Button ButtonDuplicate = GetComponentInChildren<Button>();siempre haces esto en el mismo objeto (aquel al que está adjunto este script), así que
ButtonDuplicate.onClick.AddListener( () => Add() ); siempre agrega una devolución de llamada adicional a Add para el primer botón que se encuentra entre los elementos secundarios de este objeto.
Me parece que más bien querías hacer
Button ButtonDuplicate = duplicate.GetComponentInChildren<Button>();para obtener el componente del botón que acaba de generar.
Actualizar
A tu comentario sobre el puesto
En
duplicate.transform.position=new Vector3(tni.transform.position.x, tni.transform.position.y-100, tni.transform.position.z); siempre toma la misma posición tni que nunca cambia y desde allí va -100 en Y .
En su lugar, almacene la última posición generada, por ejemplo, como
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; ... } O, en realidad, en lugar de calcular eso por su cuenta, podría usar un VerticalLayoutGroup y simplemente agregar sus botones y se colocarán automáticamente uno debajo del otro