Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建2个对象而不是1个对象_C#_Unity3d - Fatal编程技术网

C# 创建2个对象而不是1个对象

C# 创建2个对象而不是1个对象,c#,unity3d,C#,Unity3d,游戏中有一个按钮,如果你点击他,这个按钮需要创建一个对象,但是当你第一次点击它时,它会创建一个克隆,但是在你第二次点击后,它会创建一个克隆,而不是一个克隆 public float positionX; public float positionY; public Button buttonUp; Button btn1; 首先,我创建了变量 void Start () { positionX = transform.position.x; positionY = trans

游戏中有一个按钮,如果你点击他,这个按钮需要创建一个对象,但是当你第一次点击它时,它会创建一个克隆,但是在你第二次点击后,它会创建一个克隆,而不是一个克隆

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>();
}
并在用户单击按钮set 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个对象,而不是1个。此模式将重复,即第三次单击将导致它现在添加3个对象

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

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

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

void Update() 
{
}
void Start()
{
位置x=变换位置x;
位置y=变换位置y;
btn1=buttonUp.GetComponent();
btn1.onClick.AddListener(向上单击);
}
无效更新()
{
}

我相信问题发生了,因为每次单击鼠标时(在您的
更新
功能中)都会添加一个按钮单击侦听器。第一次单击鼠标时,它会在
更新期间添加第一个侦听器,第二次单击鼠标时,它会在
更新期间添加另一个侦听器。因此,现在单击鼠标时,会触发这两个侦听器,添加2个对象,而不是1个。此模式将重复,即第三次单击将导致它现在添加3个对象

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

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

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

void Update() 
{
}
void Start()
{
位置x=变换位置x;
位置y=变换位置y;
btn1=buttonUp.GetComponent();
btn1.onClick.AddListener(向上单击);
}
无效更新()
{
}

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

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


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

罪魁祸首在于Update()方法:

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


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

我不太清楚“但是在您第二次单击后,它正在创建一个克隆,而不是一个克隆”,这是什么意思。你能把范围扩大一点吗?另外,如果您第三次单击,是否会得到三个克隆?它会继续为已创建的克隆再创建一个克隆。e、 g如果你点击3次,它会创建3个对象而不是一个对象。我有点不清楚你所说的“但是在你第二次点击后,它会创建一个克隆而不是一个克隆”。你能把范围扩大一点吗?另外,如果您第三次单击,是否会得到三个克隆?它会继续为已创建的克隆再创建一个克隆。e、 g如果单击3次,它将创建3个对象,而不是一个对象。
void Update() 
{
    if (Input.GetMouseButtonDown(0))
    {
        btn1.onClick.AddListener(UpClicked);
    }
}