Unity C#实现Dropdown选中项自动滚动及模板保持显示
Unity Dropdown 自定义功能实现
功能1:选择选项后模板保持可见
默认Unity Dropdown选中选项后会自动关闭下拉模板,要实现选中后保持模板可见,只需监听选项变更事件,在选中后强制重新打开模板即可:
using UnityEngine; using UnityEngine.UI; public class CustomDropdown : MonoBehaviour { private Dropdown _dropdown; void Start() { _dropdown = GetComponent<Dropdown>(); // 监听选项变更事件 _dropdown.onValueChanged.AddListener(KeepTemplateVisible); } void KeepTemplateVisible(int selectedIndex) { // 切换模板显示状态(抵消默认的关闭操作) _dropdown.Toggle(); // 也可以直接设置模板为可见:_dropdown.template.gameObject.SetActive(true); } }
功能2:打开模板时自动滚动到上次选中的选项
要实现打开下拉框时自动定位到之前选中的选项,需要获取滚动组件,计算选中项的位置并调整滚动条:
在上面的脚本中补充以下代码:
private ScrollRect _dropdownScrollRect; private RectTransform _contentRect; void Start() { _dropdown = GetComponent<Dropdown>(); _dropdown.onValueChanged.AddListener(KeepTemplateVisible); // 获取下拉框的滚动组件和内容容器 _dropdownScrollRect = _dropdown.template.GetComponentInChildren<ScrollRect>(); _contentRect = _dropdownScrollRect.content; // 监听模板打开事件(通过Selectable的选中事件触发) _dropdown.template.GetComponent<Selectable>().onSelect.AddListener(_ => ScrollToLastSelected()); } void ScrollToLastSelected() { if (_dropdown.options.Count == 0) return; // 获取选中项的RectTransform RectTransform selectedItem = _contentRect.GetChild(_dropdown.value).GetComponent<RectTransform>(); // 获取单选项高度(假设所有选项高度一致) float itemHeight = selectedItem.rect.height; // 计算内容容器总高度和视口高度 float contentTotalHeight = _contentRect.rect.height; float viewportHeight = _dropdownScrollRect.viewport.rect.height; // 计算选中项需要滚动到的位置比例 float targetScrollPos = 1 - ((_dropdown.value * itemHeight + itemHeight / 2) / (contentTotalHeight - viewportHeight)); // 限制滚动范围在0-1之间 targetScrollPos = Mathf.Clamp01(targetScrollPos); // 设置滚动条位置 _dropdownScrollRect.verticalNormalizedPosition = targetScrollPos; }
使用步骤
- 创建上述C#脚本,命名为
CustomDropdown - 将脚本挂载到场景中的Dropdown对象上
- 运行场景测试即可实现两个自定义功能
内容的提问来源于stack exchange,提问作者Ratsha Yuu
相关产品推荐
相关产品推荐

