如何从列表中将EventTriggers添加到多个实例化的预制件?

时间:2016-06-06 11:34:10

标签: unity3d instantiation unity5 eventtrigger

我有一个预制件,我正在产生一个动态的数量。

我想在pointerclick上附加一个事件触发器来调用接受int作为参数的方法。

我有以下代码可以部分工作,但添加到每个预制件的事件使用相同的参数,即使它们以不同的方式给出。

foreach (EasterEgg EE in AllEasterEggs.List)
{
    Transform x = Instantiate(EasterEggPrefab);
    ...
    EventTrigger.Entry Entry = new EventTrigger.Entry();
    Entry.eventID = EventTriggerType.PointerClick;
    Entry.callback.AddListener((eventData) => { EasterEggClicked(EE.ID); });

    x.GetChild(1).GetComponent<EventTrigger>().triggers.Add(Entry);
}

EE.Id第一项将是0,然后它将是1,然后是2等我调试以确保在添加监听器时EE.Id是正确的数字,这是真的。正确添加了触发器。

但是当我触发触发器(怎么说?)时,传递的参数beign始终是该列表中最后一项的参数。例如,如果AllEasterEggs.List包含5个元素,则所有元素都会在指针点击时触发调用EasterEggClicked(4),而它们应该是EasterEggClicked(0)到EasterEggClicked(4)。

1 个答案:

答案 0 :(得分:1)

作为请求,这就是答案:

不是将EE对象传递给无名委托,而是先存储EE.ID的值并传递给它:

foreach (EasterEgg EE in AllEasterEggs.List)
{
    Transform x = Instantiate(EasterEggPrefab);
    ...
    EventTrigger.Entry Entry = new EventTrigger.Entry();
    Entry.eventID = EventTriggerType.PointerClick;
    int ID = EE.ID;
    Entry.callback.AddListener((eventData) => { EasterEggClicked(ID); });

    x.GetChild(1).GetComponent<EventTrigger>().triggers.Add(Entry);
}