Ohranjanje fokusa zunaj predmeta uporabniškega vmesnika

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik Unity
  • 2020.3.25F1

Predpogoji za ta nasvet

Naslednje nastavitve so bile vnaprej narejene kot predpogoj za razlago teh nasvetov.

Kaj se vam je zdelo koristno v tem nasvetu?

Prvotna zgodba je bila nekje, vendar je nisem mogel najti z iskanjem ključnih besed.

O fokusu

Predmeti uporabniškega vmesnika Unity, tako kot katera koli druga aplikacija, imajo lahko fokus, ki označuje, da so aktivni kot vhodni cilji. Če pa kliknete ali se dotaknete česarkoli drugega kot predmeta, bo predmet z ostrino izginil. Morda ne bo mogoče sprejeti postopkov s tipkovnico ali igralno konzolo.

V tem razdelku je opisano, kako s skriptnim izvajanjem nadzirate fokus, da ne izgubite fokusa pri psevdu. Upoštevajte, da ta podpora ni funkcija Unity in lahko za trenutek izgubite fokus.

Postavitev predmeta

Vrsta predmeta pri nadzoru ostrenja ni pomembna, zato jo ustrezno namestite.

Obarvan je tako, da je enostavno videti, da je v fokusu.

Zaenkrat, če ga zaženete v tem stanju, lahko vidite, da če kliknete na prazno mesto, potem ko predmet prejme fokus, bo izgubil fokus.

Nadzorujte, da ne izgubite fokusa

Če želite to narediti, ustvarite skript. Ime skripta je lahko karkoli, vendar FocusRequired ga pustite kot .

Kodo vnesite na naslednji način:

using System.Collections;
using System.Linq;                 // 追加
using UnityEngine;
using UnityEngine.EventSystems;    // 追加
using UnityEngine.UI;              // 追加

public class FocusRequired : MonoBehaviour
{
  /// <summary>
  /// <see cref="Selectable"/> をフックするクラスです。
  /// </summary>
  private class SelectionHooker : MonoBehaviour, IDeselectHandler
  {
    /// <summary>親コンポーネント。</summary>
    public FocusRequired Restrictor;

    /// <summary>
    /// 選択解除時にそれまで選択されていたオブジェクトを覚えておく。
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDeselect(BaseEventData eventData)
    {
      Restrictor.PreviousSelection = eventData.selectedObject;
    }
  }

  /// <summary>選択させないオブジェクト一覧。</summary>
  [SerializeField] private GameObject[] NotSelectables;

  /// <summary>直前まで選択されていたオブジェクト。</summary>
  private GameObject PreviousSelection = null;

  /// <summary>
  /// 選択対象のオブジェクト一覧。
  /// </summary>
  private GameObject[] _selectables;

  private void Awake()
  {
    // すべての Selectable を取得する
    var selectableList = (FindObjectsOfType(typeof(Selectable)) as Selectable[]).ToList();

    // 選択除外がある場合は外す
    if (NotSelectables != null)
    {
      foreach (var item in NotSelectables)
      {
        var sel = item?.GetComponent<Selectable>();
        if (sel != null) selectableList.Remove(sel);
      }
    }

    _selectables = selectableList.Select(x => x.gameObject).ToArray();

    // フォーカス許可オブジェクトに SelectionHooker をアタッチ
    foreach (var selectable in this._selectables)
    {
      var hooker = selectable.AddComponent<SelectionHooker>();
      hooker.Restrictor = this;
    }

    // フォーカス制御用コルーチンをスタート
    StartCoroutine(RestrictSelection());
  }

  /// <summary>
  /// フォーカス制御処理。
  /// </summary>
  /// <returns></returns>
  private IEnumerator RestrictSelection()
  {
    while (true)
    {
      // 別なオブジェクトを選択するまで待機
      yield return new WaitUntil(
          () => (EventSystem.current != null) && (EventSystem.current.currentSelectedGameObject != PreviousSelection));

      // まだオブジェクトを未選択、または許可リストを選択しているなら何もしない
      if ((PreviousSelection == null) || _selectables.Contains(EventSystem.current.currentSelectedGameObject))
      {
        continue;
      }

      // 選択しているものがなくなった、または許可していない Selectable を選択した場合は前の選択に戻す
      EventSystem.current.SetSelectedGameObject(PreviousSelection);
    }
  }
}

Ne bom šel v preveč podrobnosti, ampak Ohranjam trenutni predmet izbora in če »izbranega predmeta ni več« ali »Izbral sem predmet, za katerega ne želim, da je izbran«, se vrnem na prejšnji izbor.

Ta komponenta se lahko pritrdi na kateri koli predmet, ki obstaja, zato EventSystem jo pritrdite na .

Ker je mogoče določiti predmet, za katerega ne želite, da je izbran kot lastnost, poskusimo postaviti gumb, ki ga ne želite izbrati.

Not Selectables gumb je nastavljen na .

Poskusite ga zagnati, da vidite, kako deluje. Najprej kliknite predmet, da ga izberete, nato pa kliknite prazno območje, da ne izgubi fokusa.

Prav tako lahko zagotovite, da s klikom gumba, ki je nastavljen na neizbrano, ne premaknete fokusa.