2016-12-29 3 views
0

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 
//}} 

답변

0

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

이러한이 람다 표현식이라고

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

시도하고 그들을 here

+0

을하지만은 부울 값을 잃는다. – Everts

+0

(x, y) => doSomething (x, y) –

0

아니, 당신은 그것을 할 수 없습니다에 대한 더 많은 정보를 찾을 수 있습니다 직접하지만 여기에 그 방법이 있습니다. 다음을 시도해보십시오 (테스트하지는 않았지만 아이디어를 얻을 수 있습니다). 학생과 관련된 행동에 대한 참조를 저장하고 필요한 경우 나중에 수신기를 제거하기 위해 학생 필드에 UnityEngine.Events.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) ; 
관련 문제