c# - 复制功能

标签 c# unity3d

每当我调用 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永远不会改变的位置,然后从那里开始 -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 而不是自己计算。只需添加您的按钮,它们就会自动放置在彼此下方

关于c# - 复制功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66764539/

相关文章:

c# - 将 Borland C++ 方法公开给 C#

c# - 带有 List<> 作为 TValue 的字典

c# - OpenCover 生成一个空报告

c# - 如何解决我的两个 Unity 包中的冲突 DLL?

javascript - UnityScript 与 Javascript

c# - 如何在场景之间保持值(value)?

android - Firebase 的 Unity 身份验证错误

c# - Unity - GetComponentsInChildren<T>() 返回顺序

c# - 决定何时使用 XmlDocument 与 XmlReader

c# - 无法在 nuget 包管理器 visual studio 2015 安装 "Microsoft.AspNet.Razor 3.2.3"