Unity UI卡片按钮首次点击无响应问题排查求助
问题分析
需求:
- 按钮1为卡片图片,按钮2为黑桃图片
- 先点击黑桃图片,其指示灯亮起;之后点击卡片图片,使黑桃图标消失
遇到的问题:点击黑桃按钮后,指示灯亮起且Inspector中spadeselected布尔值变为true,但首次点击卡片按钮无任何反应,第二次及之后点击正常
示意图:
卡片按钮的main脚本
public class main : MonoBehaviour { private bool ace = false; spadestatement _spadestatement; public GameObject spadebutton; public GameObject spade_icon; private void Awake() { _spadestatement = spadebutton.GetComponent<spadestatement>(); } private void Start() { gameObject.GetComponent<Button>().onClick.AddListener(turnoff); } private void turnoff() { ace ^= true; if (_spadestatement.spadeselected == true) { spade_icon.SetActive(ace); } } }
黑桃按钮的spadestatement脚本
public class spadestatement : MonoBehaviour { public bool spadeselected; public GameObject indicator; void Start() { gameObject.GetComponent<Button>().onClick.AddListener(select); } public void select() { spadeselected ^= true; indicator.SetActive(spadeselected); } }
问题原因
核心逻辑矛盾导致首次点击无效果:
- 初始状态
ace = false,而黑桃图标默认是显示状态(需求是点击卡片后让它消失) - 当
spadeselected变为true后,首次点击卡片按钮:ace从false翻转成true- 执行
spade_icon.SetActive(true),图标保持显示,视觉上无变化
- 第二次点击时,
ace翻转回false,执行spade_icon.SetActive(false),图标才会消失,符合预期
解决方案
根据需求调整turnoff方法的逻辑,去掉多余的ace变量翻转,直接控制图标状态:
方案一:点击卡片直接隐藏黑桃图标(符合原始需求)
private void turnoff() { if (_spadestatement.spadeselected) { spade_icon.SetActive(false); } }
方案二:支持点击卡片切换图标显示/隐藏(仅当黑桃按钮被选中时)
如果需要后续可以再次点击卡片显示图标,可直接基于图标当前状态判断:
private void turnoff() { if (_spadestatement.spadeselected) { spade_icon.SetActive(!spade_icon.activeSelf); } }
额外建议:变量名遵循C#驼峰命名规范,比如spadeselected改为spadeSelected,_spadestatement改为_spadeStatement,提升代码可读性。
内容的提问来源于stack exchange,提问作者Yuzuru_10
相关产品推荐
相关产品推荐

