将参数传递给事件侦听器以进行统一切换

时间:2016-12-29 05:46:18

标签: c# unity3d

在我的Unity项目中,我创建基于JSON响应动态切换,然后为每个切换添加一个监听器。现在,每次单击切换时,它都会成功调用SomeListener函数。但是,我只能传递切换的值(truefalse),理想情况下我希望能够传递切换的值和额外的参数({{ 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);
}

2 个答案:

答案 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 ) ;