游戏中有一个按钮,如果您单击它,则该按钮需要创建一个对象,但是当您第一次单击它时,它会创建一个克隆,但是在第二次单击后,它会向其中添加一个克隆。其他而不是一个克隆。
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)
答案 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()函数-事件发生时只有一个函数调用。