循环显示 UI 对象的选择

更新页 :
页面创建日期 :

验证环境

窗户
  • 窗户 11
Unity 编辑器
  • 2020.3.25f1

此提示的先决条件

作为解释这些提示的先决条件,已提前进行了以下设置。

参考

部署示例 UI 对象

将按钮放在画布上,如下所示: 为清楚起见,所选对象以绿色显示。

只能选择位于选定方向的对象。

放置 UI 对象时,最初可以按键盘或游戏手柄上的箭头键以按指定方向选择 UI 对象。 这非常直观且易于理解,因此我认为您无需费心更改设置。

但是,在类似菜单的布局中,默认情况下无法执行选择循环操作,例如“选择底部时按下时返回顶部”。

在上图中,您不能在选择 Button1 时通过按下 Button3 来选择 Button3。 当然,如果在选择 Button1 时按向上,则无法选择 Button3。

循环显示选区

在这里,我们将创建一种机制,允许您无休止地循环浏览选择。 在示例布局中,可以选择 Button1,同时按下 Button3,也可以通过选择 Button3 时选择 Button1。

此控件是在脚本中完成的。 它是一个通用脚本,可以与少量描述一起使用,并且可以像在其他场景中一样使用。 相反,以下限制适用:

  • 您只能在一个方向上下移动。
  • 适用于指定对象下的所有 Selectable 现有对象

因此,使用目标仅限于通过上下滚动选择的菜单,但如果您将自己限制在该布局中,这将非常有用。 顺便说一句,它仅限于顶部和底部,但是如果您稍微修改脚本,则可以将其限制为左侧和右侧。

在项目中创建脚本。 你可以给它起任何名字,但我会 SelectLoop 把它保留为 .

脚本如下所示:

using UnityEngine;
using UnityEngine.UI;  // 追加

public class SelectLoop : MonoBehaviour
{
  // 最初のフレーム更新の前に開始が呼び出されます
  void Start()
  {
    // ボタンなど選択可能なコンポーネントを取得する
    var selects = GetComponentsInChildren<Selectable>();
    for (var i = 0; i < selects.Length; i++)
    {
      var nav = selects[i].navigation;
      nav.mode = Navigation.Mode.Explicit;
      nav.selectOnUp = selects[i == 0 ? selects.Length - 1 : i - 1];
      nav.selectOnDown = selects[(i + 1) % selects.Length];
      selects[i].navigation = nav;
    }
  }

  // 更新はフレームごとに1回呼び出されます
  void Update() { }
}

我们正在做的是 对键选择行为 navigation 进行以下设置 。

  • 按向上键选择上一个对象,选择最后一个对象选择第一个对象。
  • 按向下键选择下一个对象,如果第一个对象是最后一个对象,则选择第一个对象。

顺便说一下,这个对象的顺序(可选)取决于层次结构的顺序。 按照您希望在层次结构中选择它们的顺序排列它们。

保存脚本后,将其作为组件附加。 这个脚本会应用到附加对象 Selectable 中,所以这次 Canvas 我们会附加到。

尝试移动它,看看你是否可以通过击键在 Button1 和 Button3 之间移动它。