Unity中能否用单个foreach循环为Button、Toggle统一添加PointerEnter音效?
泛型方法报错原因
- 泛型参数
T在方法调用时是单一确定的类型,比如你调用AddToList<Button>()时T就是Button类型,自然无法存储Toggle类型对象;就算你指定T为Selectable,也需要显式完成子类型到父类型的转换才能添加到列表,你当前的写法没有做对应处理,所以会报转换失败错误。 - 你的需求本身不需要使用泛型,
Button和Toggle共同的父类Selectable已经包含了你需要用到的gameObject属性,直接声明List<Selectable>存储两类组件即可。
单循环实现方案
直接把两类组件都加入List<Selectable>后统一遍历即可,优化后的代码如下(额外补充了组件存在性判断,避免重复添加EventTrigger):
private void SoundsOnButtons() { List<Selectable> selectables = new List<Selectable>(); selectables.AddRange(Resources.FindObjectsOfTypeAll<Button>()); selectables.AddRange(Resources.FindObjectsOfTypeAll<Toggle>()); foreach (var obj in selectables) { EventTrigger trigger = obj.gameObject.GetComponent<EventTrigger>(); if (trigger == null) { trigger = obj.gameObject.AddComponent<EventTrigger>(); } EventTrigger.Entry eventEnter = new EventTrigger.Entry(); eventEnter.eventID = EventTriggerType.PointerEnter; eventEnter.callback.AddListener((eventData) => { Sound.PlaySfxOneShot(Sound.GiveSfxSound(7)); }); trigger.triggers.Add(eventEnter); } }
内容的提问来源于stack exchange,提问作者Ronny Bigler
相关产品推荐
相关产品推荐

