C# 将参数传递给事件侦听器以进行统一切换
在我的Unity项目中,我基于JSON响应动态创建切换,然后为每个切换添加一个侦听器。现在,每次单击切换,它都会成功调用C# 将参数传递给事件侦听器以进行统一切换,c#,unity3d,C#,Unity3d,在我的Unity项目中,我基于JSON响应动态创建切换,然后为每个切换添加一个侦听器。现在,每次单击切换,它都会成功调用SomeListener函数。但是,我只能将切换值(true或false)传递给侦听器,理想情况下,我希望能够将切换值和额外参数(student.\u id)传递给侦听器 foreach(var student in students) { GameObject studentObject = (GameObject) Instantiate(StudentAt
SomeListener
函数。但是,我只能将切换值(true
或false
)传递给侦听器,理想情况下,我希望能够将切换值和额外参数(student.\u 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);
}
试一试
这些被称为lambda表达式,您可以找到关于它们的更多信息不,您不能直接进行,但这里有一种方法。试试下面的方法(我还没有测试过,但你会明白的)。您必须向类型为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
}}
但这会丢失布尔值。(x,y)=>doSomething(x,y)
studentObject.GetComponent<Toggle> ().onValueChanged.AddListener((id)=> SomeListener(student._id));
void SomeListener (float id) {
Debug.Log("Student id?:"+id);
}
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
}}
student.listener = (val) => SomeListener( val, id ) ;