Kad nebūtų suaktyvintas vartotojo sąsajos objektas

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto, kaip būtina sąlyga šiems patarimams paaiškinti.

Kas jums pasirodė naudinga šiame patarime?

Originali istorija buvo kažkur, bet aš negalėjau jos rasti ieškodamas raktinių žodžių.

Apie "Focus"

"Unity" vartotojo sąsajos objektai, kaip ir bet kuri kita programa, gali būti sufokusuoti, nurodantys, kad jie yra aktyvūs kaip įvesties tikslai. Tačiau jei spustelėsite ar paliesite ką nors kitą, išskyrus objektą, sufokusuotas objektas išnyks. Gali būti neįmanoma priimti operacijų naudojant klaviatūrą ar žaidimų pultą.

Šiame skyriuje aprašoma, kaip naudoti scenarijus fokusavimui valdyti, kad jis neprarastų fokusavimo pseudo. Atminkite, kad šis palaikymas nėra "Unity" funkcija ir dėl to trumpam galite prarasti dėmesį.

Objekto išdėstymas

Objekto tipas neturi reikšmės fokusavimo valdyme, todėl padėkite jį tinkamai.

Jis yra spalvotas taip, kad būtų lengva pamatyti, kad jis yra sufokusuotas.

Šiuo metu, jei paleisite jį šioje būsenoje, galite pamatyti, kad jei spustelėsite tuščią vietą po to, kai objektas gaus fokusavimą, jis praras fokusavimą.

Valdykite, kad neprarastumėte dėmesio

Norėdami tai padaryti, sukurkite scenarijų. Scenarijaus pavadinimas gali būti bet koks, bet FocusRequired palikite jį kaip .

Įveskite kodą taip:

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);
    }
  }
}

Per daug nesigilinsiu, bet Tai, ką darau, yra išlaikyti dabartinį pasirinkimo objektą, o jei "pasirinkto objekto nebėra" arba "pasirinkau objektą, kurio nenoriu pasirinkti", grįžtu prie ankstesnio pasirinkimo.

Šis komponentas gali būti pritvirtintas prie bet kurio egzistuojančio objekto, todėl EventSystem pridėkite jį prie .

Kadangi galima nurodyti objektą, kurio nenorite pasirinkti kaip ypatybės, pabandykime įdėti mygtuką, kurio nenorite pasirinkti.

Not Selectables mygtukas nustatytas į .

Pabandykite jį paleisti, kad pamatytumėte, kaip jis veikia. Pirmiausia spustelėkite objektą, kad jį pasirinktumėte, tada spustelėkite tuščią sritį, kad jis neprarastų dėmesio.

Taip pat galite įsitikinti, kad spustelėjus mygtuką, kuris nustatytas kaip nepažymėtas, židinys neperkeliamas.