Fookuse hoidmine kasutajaliidese objektist eemal

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1

Selle näpunäite eeltingimused

Nende näpunäidete selgitamise eeltingimuseks on eelnevalt tehtud järgmised seadistused.

Mis teile sellest näpunäitest abi oli?

Algne lugu oli kuskil, kuid ma ei leidnud seda märksõnu otsides.

Teave fookuse kohta

Unity UI objektidel, nagu ka kõigil teistel rakendustel, võib olla fookus, mis näitab, et need on sisendi sihtmärkidena aktiivsed. Kui aga klõpsate või puudutate midagi muud kui objekti, kaob fookusega objekt. Klaviatuuri või mängupuldiga ei pruugi olla võimalik toiminguid vastu võtta.

Selles jaotises kirjeldatakse, kuidas kasutada skriptimist fookuse juhtimiseks, et see ei kaotaks pseudofookuses fookust. Pange tähele, et see tugi ei ole Unity funktsioon ja võib põhjustada hetkeks fookuse kaotamise.

Objekti paigutamine

Objekti tüüp ei ole fookuse juhtimisel oluline, seega asetage see sobivalt.

See on värvitud nii, et on lihtne näha, et see on fookuses.

Praegu, kui käivitate selle selles olekus, näete, et kui klõpsate tühjale kohale pärast seda, kui objekt saab fookuse, kaotab see fookuse.

Juhtige nii, et te ei kaotaks fookust

Selleks looge skript. Skripti nimi võib olla ükskõik milline, kuid FocusRequired jätke see .

Sisestage kood järgmiselt:

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

Ma ei lasku liiga detailidesse, kuid Mida ma teen, on praeguse valikuobjekti säilitamine ja kui "valitud objekt on kadunud" või "Olen valinud objekti, mida ma ei soovi, et mind valitaks", naasen eelmisele valikule.

Seda komponenti saab kinnitada mis tahes olemasolevale objektile, seega EventSystem kinnitage see .

Kuna on võimalik määrata objekt, mida te ei soovi atribuudiks valida, proovime asetada nupu, mida te ei soovi valida.

Not Selectables nupp on seatud väärtusele .

Proovige seda käivitada, et näha, kuidas see töötab. Kõigepealt klõpsake objektil selle valimiseks ja seejärel klõpsake tühjal alal, et see ei kaotaks fookust.

Samuti saate veenduda, et nupu klõpsamine, mis on seatud valimata, ei liiguta fookust.