Передача аргументов в прослушиватель событий для unity переключает

В моем проекте Unity я создаю переключатели динамически на основе ответа JSON, а затем добавляю прослушиватель к каждому переключателю. Прямо сейчас, каждый раз, когда я нажимаю на переключатель, он успешно вызывает SomeListenerфункцию. Однако я могу передать только значение переключателя ( trueили false), и в идеале я хотел бы иметь возможность передать как значение переключателя, так и дополнительный аргумент ( student._id) слушателю.

foreach(var student in students) {
        GameObject studentObject = (GameObject) Instantiate(StudentAttendancePreFab, currentPos, transform.rotation);
        studentObject.GetComponent<AttendanceItem> ().studentId = student._id;
        studentObject.GetComponent<Toggle> ().isOn = student.attending;
        studentObject.GetComponent<Toggle> ().onValueChanged.AddListener(SomeListener);


        //is there some way to do this?
        //studentObject.getComponent<Toggle> ().onValueChanged.AddListener(SomeListener, student._id);
}

Прослушиватель для каждого переключателя.

void SomeListener (bool isClicked) {
    Debug.Log(isClicked);
}

//is there some way to do this?
//void SomeListener(bool isClicker, string studentId) {
    //something
//}}

2 ответа

  1. пытаться

    studentObject.GetComponent<Toggle> ().onValueChanged.AddListener((id)=> SomeListener(student._id));
    

    и

    void SomeListener (float id) {
        Debug.Log("Student id?:"+id);
    }
    

    они называются лямбда-выражениями, и вы можете найти более подробную информацию о них здесь

  2. Нет, вы не можете сделать это напрямую, но вот способ сделать это. Попробуйте следующее (Я еще не протестировал его, но вы получите идею). Вы должны будете объявить общедоступное поле классу вашего студента типа UnityEngine.Мероприятия.UnityAction таким образом, чтобы сохранить ссылку на действие, связанное с вашим студентом и удалить слушателя позже, если вам нужно.

    foreach(var student in students) {
            // ..
            string id = student._id ;
            student.listener = MyStudentListener( id ) ;
            studentObject.GetComponent<Toggle> ().onValueChanged.AddListener(student.listener);
    }
    
    // ...
    
    private UnityEngine.Events.UnityAction<bool> MyStudentListener( string id )
    {
         return (val) => SomeListener( val, id ) ;
    }
    
    void SomeListener(bool isClicker, string studentId) {
        // something
    }}
    

    Примечание: функция MyStudentListener может быть опущена, если вы хотите :

     student.listener = (val) => SomeListener( val, id ) ;