创建2个对象而不是1

时间:2018-08-30 13:47:07

标签: c# unity3d

游戏中有一个按钮,如果您单击它,则该按钮需要创建一个对象,但是当您第一次单击它时,它会创建一个克隆,但是在第二次单击后,它会向其中添加一个克隆。其他而不是一个克隆。

public float positionX;
public float positionY;
public Button buttonUp;
Button btn1;

首先,我创建了变量。

void Start () 
{
    positionX = transform.position.x;
    positionY = transform.position.y;

    btn1 = buttonUp.GetComponent<Button>();
}

然后在“开始方法”和“按钮”组件上分配位置的值

void Update() 
{
    if (Input.GetMouseButtonDown(0))
    {
        btn1.onClick.AddListener(UpClicked);
    }
}

并控制用户是否单击按钮设置addListener

float[] CreatePlayerPartsUp(float pX, float pY)
{
    float positionXFun = pX;
    float positionYFun = pY;

    GameObject part = Instantiate(playerParts, new Vector2(positionXFun, positionYFun + 16), Quaternion.identity);

    float[] turnPosition = new float[2]{part.transform.position.x, part.transform.position.y};

    return turnPosition;
}

之后,我创建了一个方法来保留对象的位置并使用数组将其返回。

void UpClicked()
{
    float[] createdPosition= CreatePlayerPartsUp(positionX, positionY);
    positionX = createdPosition[0];
    positionY = createdPosition[1];
}

最后,我调用该方法并分配了新位置。

但是问题已经发生,我不知道为什么会发生。 (首先,创建1,但其他时候它开始创建,将一个克隆添加到另一个而不是1)

2 个答案:

答案 0 :(得分:2)

我认为该问题正在发生,因为您每次在Update函数中单击鼠标时都会添加一个按钮单击侦听器。第一次单击鼠标会在Update期间添加第一个侦听器,第二次单击鼠标会在Update期间添加另一个侦听器。因此,现在单击鼠标时,这两个侦听器均被触发,添加了2个对象而不是1个。这种模式将重复出现,即单击第3次将导致现在添加3个对象。

AddListener函数调用移至Start函数中,以便仅添加一个侦听器,如下所示:

void Start () 
{
    positionX = transform.position.x;
    positionY = transform.position.y;

    btn1 = buttonUp.GetComponent<Button>();
    btn1.onClick.AddListener(UpClicked);
}

void Update() 
{
}

答案 1 :(得分:1)

罪魁祸首在您的Update()方法中:

void Update() 
{
    if (Input.GetMouseButtonDown(0))
    {
        btn1.onClick.AddListener(UpClicked);
    }
}

这会在每次单击鼠标时向UpClickd()事件中的onClick添加另一个调用,这可能不是您想要的。

AddListener移动到Start()函数-事件发生时只有一个函数调用。