在我的Unity项目中,我创建基于JSON响应动态切换,然后为每个切换添加一个监听器。现在,每次单击切换时,它都会成功调用SomeListener
函数。但是,我只能传递切换的值(true
或false
),理想情况下我希望能够传递切换的值和额外的参数({{ 1}})听众。
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);
}
答案 0 :(得分:0)
试
studentObject.GetComponent<Toggle> ().onValueChanged.AddListener((id)=> SomeListener(student._id));
和
void SomeListener (float id) {
Debug.Log("Student id?:"+id);
}
这些被称为lambda表达式,您可以找到有关它们的更多信息here
答案 1 :(得分: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 ) ;