2016-01-12 3 views
0

Я использую сборку кнопки и создаю несколько кнопок во время выполнения. При добавлении списков из сценария (C#) я не могу добавить значение из списка, используя индекс (поле int в заголовке).Unity3d access int field with button.onClick.AddListner (Delegate ...)

for (int i=0; i<messageList.Count; i++) { 
     Button msgBtnObj = Instantiate (msgListPrefabObj) as Button; 
     MessageListPrefabScript msgListPrefabScriptRef = msgBtnObj.GetComponent<MessageListPrefabScript>(); 
     msgListPrefabScriptRef.msgText.text = msglistToShow[i].msgFieldText; //here i works 
     msgBtnObj.transform.SetParent (msglistPanel); 
     msgBtnObj.name = "msgbtn_" + msglistToShow [i].msgFieldText; //here i works 
     msgBtnObj.GetComponent<Button>().onClick.AddListener(delegate { clickedOnMsg(messageList [i]); }); //here i doesn't work 

    } 

Последняя строка дает мне исключение ArgumentOutOfRangeException. Теперь, если я использую 1,2,3 и т.д., это работает. Но как я могу использовать переменную, например? итератор цикла i?

Это StackTrace за исключением,

ArgumentOutOfRangeException: Argument is out of range. 
Parameter name: index 
System.Collections.Generic.List`1[System.String].get_Item (Int32 index) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:633) 
CreateMsgListScript+<PopulateMsglist>c__AnonStorey9.<>m__1() (at Assets/CreateMsgListScript.cs:74) 
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at /home/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:137) 
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at /home/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:601) 
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at /home/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:743) 
UnityEngine.Events.UnityEvent.Invoke() (at /home/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53) 
UnityEngine.UI.Button.Press() (at /home/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35) 
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /home/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44) 
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /home/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52) 
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /home/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) 
UnityEngine.EventSystems.EventSystem:Update() 
+1

Вы измените содержание messageList позже? Как удалить элементы из него? – Everts

+0

Согласен с @fafase, 90% это причина –

+0

У меня тоже была эта проблема, проверьте мой ответ. –

ответ

0

UnityAction делегат вы используете должны иметь нулевые Params - http://docs.unity3d.com/ScriptReference/Events.UnityEvent.AddListener.html и http://docs.unity3d.com/ScriptReference/Events.UnityAction.html И вы пытаетесь передать элемент коллекции.

+1

Вы можете использовать параметры в onClick Delegate. См. Этот ответ http://answers.unity3d.com/questions/797772/example-of-setting-up-a-button-onclick-event-via-s.html – mnaa

+0

см. комментарий на странице, которую вы предоставили: «Хотя стоит отметить, что некоторые переменные не пройдут должным образом». Это то, что у нас есть в оригинальном вопросе –

1

Поскольку нам по-прежнему нужна дополнительная информация, чтобы помочь вам решить проблему, я все равно дам вам ответ, который может помочь.
Вы повторяете список «Список сообщений», но используете его индекс для доступа к «msglistToShow». Вот почему я думаю, что вы получаете «ArgumentOutOfRangeException».

"messageList" и "msglistToShow" могут иметь разный размер/количество.

+0

Оба они имеют одинаковый размер. Хотя я хотел бы сообщить вам, что после прочтения вашего решения я попытался использовать индекс messagelist. Ошибка была такой же. Но если я положил, msgBtnObj.GetComponent