首页 > 解决方案 > 复制函数

问题描述

每当我调用 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 个,依此类推如果你知道如何修复它请告诉我 **

标签: c#unity3d

解决方案


问题线似乎是

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;
    ...
}

或者实际上,您可以使用 aVerticalLayoutGroup并添加您的按钮,而不是自己计算,它们将自动放置在彼此下方


推荐阅读