游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:542

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 523|回复: 6

[GUI] (UGUI)键盘操作的UI列表 实现思路?

[复制链接]  [移动端链接]
7日久生情
2538/5000
排名
1027
昨日变化

47

主题

713

帖子

2538

积分

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

UID
69941
好友
1
蛮牛币
7623
威望
0
注册时间
2015-1-20
在线时间
782 小时
最后登录
2018-7-15
发表于 2018-6-29 12:20:46 | 显示全部楼层 |阅读模式
60蛮牛币
Scroll Rect提供了便于鼠标滚动和拖拽的滚动列表功能,但对于只支持键盘操作的滚动列表没用提供支持,例如想实现下图这样一个列表,使用上下方向键选择,
列表一共有20项,但列表可视区域只显示6项,如何实现使用上下方向键选择时,当选中对象超出可视区域,列表中的项目自动滚动 使选中对象始终在可视区域中?


屏幕快照 2018-06-29 下午12.11.47.png

本帖被以下淘专辑推荐:


回复

使用道具 举报

排名
32366
昨日变化
38

0

主题

8

帖子

55

积分

Rank: 2Rank: 2

UID
253985
好友
0
蛮牛币
207
威望
0
注册时间
2017-11-13
在线时间
39 小时
最后登录
2018-7-12
发表于 2018-6-29 12:20:47 | 显示全部楼层
煮粥侠 发表于 2018-6-29 12:34
我的思路是 每一项的OnSelect()时,判断自身位置与显示区域上/下边缘位置,如果超出,就使20项的parent整 ...

是像素,但是要注意scale值。
不一定需要比较边缘位置,只需要比较Text锚点和Content节点的位置关系,高度30锚点在左侧中心的Text和高度为900的ViewPort,那Text的localPosition在[-885,-15]是可见的

回复

使用道具 举报

7日久生情
2538/5000
排名
1027
昨日变化

47

主题

713

帖子

2538

积分

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

UID
69941
好友
1
蛮牛币
7623
威望
0
注册时间
2015-1-20
在线时间
782 小时
最后登录
2018-7-15
 楼主| 发表于 2018-6-29 12:34:36 | 显示全部楼层
本帖最后由 煮粥侠 于 2018-7-2 09:31 编辑

解决了,实现方法: 屏幕快照 2018-07-02 上午9.30.13.png

[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Button_ScrollList : ButtonBase {
        
        RectTransform m_rect;
        RectTransform content;//包含所有项的父对象

        float Bound_Up,Bound_Down;//显示区域上下边界位置
        float offset;//Povit在中心时,偏移为每一项高度的一半

        protected override void Awake ()
        {
                base.Awake();
                m_rect=GetComponent<RectTransform>();
                content=transform.parent.GetComponent<RectTransform>();
                offset=m_rect.rect.height*0.5f;
                GetViewBound(content.parent);//可视区域为Content父对象,获取可视区域的上下边界
        }
        void GetViewBound(Transform viewTrans){
                RectTransform viewRect=viewTrans.GetComponent<RectTransform>();
                Bound_Up=viewRect.rect.yMax;
                Bound_Down=viewRect.rect.yMin;
        }

        //被选中时,检查当前位置是否超出了可视区域
        public override void OnSelect (UnityEngine.EventSystems.BaseEventData eventData)
        {
                base.OnSelect (eventData);
                CheckPos();
        }


        void CheckPos(){
                Vector2 bound= GetRectBoundPos();

                if(bound.x>Bound_Up){
                        Debug.Log(gameObject.name+"高于显示区域",gameObject);
                        MoveContent(0-m_rect.rect.height);//向下移动一项的高度

                }else if(bound.y<Bound_Down){
                        Debug.Log(gameObject.name+"低于显示区域",gameObject);
                        MoveContent(m_rect.rect.height);
                }
        }
                
        void MoveContent(float y){
                content.localPosition+=new Vector3(0f,y,0f);
        }

        Vector2 GetRectBoundPos(){
                Vector2 bound=Vector2.zero;

                float currPos=content.localPosition.y+m_rect.localPosition.y;
                bound.x=currPos+offset;//up
                bound.y=currPos-offset;//down

                return bound;
        }

}



屏幕快照 2018-06-29 下午12.29.45.png

回复

使用道具 举报

7日久生情
2538/5000
排名
1027
昨日变化

47

主题

713

帖子

2538

积分

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

UID
69941
好友
1
蛮牛币
7623
威望
0
注册时间
2015-1-20
在线时间
782 小时
最后登录
2018-7-15
 楼主| 发表于 2018-7-2 09:33:08 | 显示全部楼层
筑于梓 发表于 2018-7-2 09:20
是像素,但是要注意scale值。
不一定需要比较边缘位置,只需要比较Text锚点和Content节点的位置关系,高 ...

感谢大侠,已经自行解决了,方法已经贴出,你说得全对~

回复

使用道具 举报

4四处流浪
392/500
排名
11590
昨日变化
4

2

主题

234

帖子

392

积分

Rank: 4

UID
282383
好友
0
蛮牛币
316
威望
0
注册时间
2018-5-23
在线时间
82 小时
最后登录
2018-7-13
发表于 2018-7-2 18:59:08 | 显示全部楼层
duoxie fenxiang, duoxie fengxiang

回复

使用道具 举报

5熟悉之中
632/1000
排名
3970
昨日变化
26

1

主题

112

帖子

632

积分

Rank: 5Rank: 5

UID
236305
好友
1
蛮牛币
895
威望
0
注册时间
2017-8-7
在线时间
189 小时
最后登录
2018-7-16
发表于 2018-7-3 11:22:35 | 显示全部楼层
学习学习~~~

回复

使用道具 举报

4四处流浪
306/500
排名
26836
昨日变化
20

0

主题

229

帖子

306

积分

Rank: 4

UID
183390
好友
0
蛮牛币
158
威望
0
注册时间
2016-11-14
在线时间
65 小时
最后登录
2018-7-11
发表于 2018-7-9 10:31:59 | 显示全部楼层
来看看 学习学习
[发帖际遇]: AndySwjtu 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表