找回密码
 注册帐号

扫一扫,访问微社区

GUI UGUI 一个常见的按钮问题

17
回复
1291
查看
[ 复制链接 ]
7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
2019-4-13 04:06:48 显示全部楼层 阅读模式
50蛮牛币
本帖最后由 煮粥侠 于 2019-4-13 04:10 编辑

菜单界面有多个button,用键盘上下选择(如图1)。  
当鼠标点击空白处时,会取消对button的选择(如图2).
但我需要始终有一个按钮在选中的状态,也就是说,如何在鼠标点击空白处时,不取消button的选择?
屏幕快照 2019-04-13 上午4.03.06.png

屏幕快照 2019-04-13 上午4.03.20.png 屏幕快照 2019-04-13 上午4.06.37.png


回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-13 04:17:29 显示全部楼层
这个问题曾经提问过,但大概因为描述不清楚,没有很好的答案。其实这应该是一个很常见很基本的功能吧?
我目前的解决思路是:当前选中的selectable对象存在一个变量引用里,在屏幕前放一个全透明、覆盖全屏幕的button,当它被点击时执行自己脚本上的方法:重新选中上一个选择的对象。
看起来貌似可以达成功能,但是实际上还是有按钮被取消选择又重新选中的一个过程。自己的解决方法觉得不完美,所以重新发帖继续等大佬。
回复

使用道具 举报

2初来乍到
133/150
排名
16219
昨日变化

1

主题

17

帖子

133

积分

Rank: 2Rank: 2

UID
293641
好友
0
蛮牛币
549
威望
0
注册时间
2018-8-15
在线时间
71 小时
最后登录
2019-7-22
2019-4-13 17:00:34 显示全部楼层
这个看着像复选框的功能,Toggle Group了解一下。
回复

使用道具 举报

2初来乍到
133/150
排名
16219
昨日变化

1

主题

17

帖子

133

积分

Rank: 2Rank: 2

UID
293641
好友
0
蛮牛币
549
威望
0
注册时间
2018-8-15
在线时间
71 小时
最后登录
2019-7-22
2019-4-13 17:07:37 显示全部楼层
我用Toggle Group试了一下,能达到你说的这种效果,toggle选中状态下,鼠标点击其他地方,选中状态不会改变,只需要把toggle下面的checkMark的√图片去掉,换成颜色就好
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-13 19:45:12 显示全部楼层
hongyaolee 发表于 2019-4-13 17:00
这个看着像复选框的功能,Toggle Group了解一下。

看起来像,具体功能是不一样的
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-13 19:48:04 显示全部楼层
本帖最后由 煮粥侠 于 2019-4-13 20:01 编辑
hongyaolee 发表于 2019-4-13 17:07
我用Toggle Group试了一下,能达到你说的这种效果,toggle选中状态下,鼠标点击其他地方,选中状态不会改变 ...

这个我试过,在这种情况下,虽然Toggle的选中状态没有变,但是EventSystem的当前选中对象依然是空(见顶楼图3),按键盘上的确认键是没有反应的。因为Toggle的选中状态 其实是Toggle的isOn属性,不是Selectable的选中状态,见下图:
屏幕快照 2019-04-13 下午7.51.24.png 屏幕快照 2019-04-13 下午7.58.25.png

回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-13 20:23:19 显示全部楼层
截图一个Debug模式比较容易说明白: 点击空白处后,没有影响toggle的 Is On属性(黑色虚线处),所以toggle的勾选还在。但是我需要的是selectable的Has Selection 不被取消勾选,这样键盘的操作才对这个button有效

屏幕快照 2019-04-13 下午8.17.57.png
回复

使用道具 举报

2初来乍到
133/150
排名
16219
昨日变化

1

主题

17

帖子

133

积分

Rank: 2Rank: 2

UID
293641
好友
0
蛮牛币
549
威望
0
注册时间
2018-8-15
在线时间
71 小时
最后登录
2019-7-22
2019-4-13 23:18:05 显示全部楼层
煮粥侠 发表于 2019-4-13 19:48
这个我试过,在这种情况下,虽然Toggle的选中状态没有变,但是EventSystem的当前选中对象依然是空(见顶楼 ...

恩,明白你的意思了,查了一下api,EventSystem里面有一个SetSelectedGameObject方法,可以手动设置当前选中的对象,可以定义一个gameobject,在选中某个button的时候,可以用gameobject保存一下当前选中的对象(EventSystem的api里面有currentSelectedGameObject属性,可以直接获取),鼠标点击的时候,用上面的方法把选中对象手动设置为最后选中的那个对象就行了。
我的大体思路是这样,不过具体我没试过,应该可行,你可以自己写代码试一下看看
https://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-14 20:55:33 显示全部楼层
hongyaolee 发表于 2019-4-13 23:18
恩,明白你的意思了,查了一下api,EventSystem里面有一个SetSelectedGameObject方法,可以手动设置当前 ...

非常感谢呀,不过你可以看一下我在2楼说的,目前我就是这样实现的。但是觉得不够完美,因为button还是会有一个“取消选择”->"重新选中"的过程(虽然是在1帧内),但是,如果button有OnSelect()方法,貌似会触发。

不过UGUI的源码我也粗浅的研究过一下,没找到其他办法。不知道是不是只能这么做了,还是希望有更好的方法。因为感觉这个功能其实挺常见,挺基础的,还要手动实现,太不方便了。
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-14 20:58:30 显示全部楼层
hongyaolee 发表于 2019-4-13 23:18
恩,明白你的意思了,查了一下api,EventSystem里面有一个SetSelectedGameObject方法,可以手动设置当前 ...

话说之前的某一个版本Unity (大概是5.5之前吧),EventSystem还有个公开的lastSelectedGameObject成员,结果后来一更新,它把这个给去掉了,还得自己手动记录上一个选择对象,真是佛了。。
回复

使用道具 举报

6蛮牛粉丝
1440/1500
排名
3110
昨日变化

5

主题

400

帖子

1440

积分

Rank: 6Rank: 6Rank: 6

UID
234410
好友
4
蛮牛币
1813
威望
0
注册时间
2017-7-26
在线时间
545 小时
最后登录
2019-7-22
2019-4-15 16:39:03 显示全部楼层
其实吧 我倒感觉可以自己继承下 Button 或者 Toggle 然后自己写功能或者重写 。。。
咋改咋写你都随意了。。。
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-16 00:05:42 显示全部楼层
随幻Kaller 发表于 2019-4-15 16:39
其实吧 我倒感觉可以自己继承下 Button 或者 Toggle 然后自己写功能或者重写 。。。
咋改咋写你都随意了。 ...

鼠标点击空白处就取消当前的选择 这貌似是在EventSystem里面执行的。我甚至希望不要检测任何鼠标的操作。。关于你说的方向,怎么改button有具体一点的思路吗?
回复

使用道具 举报

5熟悉之中
908/1000
排名
5478
昨日变化

16

主题

192

帖子

908

积分

Rank: 5Rank: 5

UID
236132
好友
2
蛮牛币
2425
威望
0
注册时间
2017-8-6
在线时间
440 小时
最后登录
2019-7-23
2019-4-20 11:25:02 显示全部楼层
点中之后按钮可以设为禁用状态 把禁用状态设为高亮就行 缺点就是无法再次点击 ,需要点其他按钮后该按钮恢复正常
回复

使用道具 举报

7日久生情
3052/5000
排名
781
昨日变化

56

主题

778

帖子

3052

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
9254
威望
0
注册时间
2015-1-20
在线时间
984 小时
最后登录
2019-7-22
楼主 2019-4-21 04:45:15 显示全部楼层
LLzj 发表于 2019-4-20 11:25
点中之后按钮可以设为禁用状态 把禁用状态设为高亮就行 缺点就是无法再次点击 ,需要点其他按钮后该按钮恢 ...

这样做是为了什么?禁用直接就取消选择了
回复

使用道具 举报

5熟悉之中
908/1000
排名
5478
昨日变化

16

主题

192

帖子

908

积分

Rank: 5Rank: 5

UID
236132
好友
2
蛮牛币
2425
威望
0
注册时间
2017-8-6
在线时间
440 小时
最后登录
2019-7-23
2019-4-22 15:34:32 显示全部楼层
煮粥侠 发表于 2019-4-21 04:45
这样做是为了什么?禁用直接就取消选择了

把你想要的选中状态的图片跟禁用状态的图片设为一张图片
  选中之后 Interactable=false  你点其他按钮的时候Interactable=true  这可以 不过比较麻烦 按钮太多了代码特别乱  建议使用Toggle 设一个组就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则