Διατήρηση της εστίασης εκτός του αντικειμένου περιβάλλοντος εργασίας χρήστη

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον επαλήθευσης

παράθυρα
  • Παράθυρα 11
Επεξεργαστής ενότητας
  • 2020.3.25στ1

Προϋποθέσεις για αυτήν τη συμβουλή

Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την εξήγηση αυτών των συμβουλών.

Τι βρήκατε χρήσιμο σε αυτή τη συμβουλή;

Η αρχική ιστορία ήταν κάπου, αλλά δεν μπορούσα να τη βρω αναζητώντας λέξεις-κλειδιά.

Σχετικά με το Focus

Τα αντικείμενα Unity UI, όπως και κάθε άλλη εφαρμογή, μπορούν να έχουν μια εστίαση που υποδεικνύει ότι είναι ενεργά ως στόχοι εισόδου. Ωστόσο, εάν κάνετε κλικ ή αγγίξετε οτιδήποτε άλλο εκτός από το αντικείμενο, το αντικείμενο με εστίαση θα εξαφανιστεί. Ενδέχεται να μην είναι δυνατή η αποδοχή λειτουργιών με πληκτρολόγιο ή gamepad.

Αυτή η ενότητα περιγράφει τον τρόπο χρήσης δεσμών ενεργειών για τον έλεγχο της εστίασης, ώστε να μην χάσει την εστίαση σε ένα ψευδο. Σημειώστε ότι αυτή η υποστήριξη δεν είναι δυνατότητα Unity και μπορεί να σας κάνει να χάσετε την εστίαση για λίγο.

Τοποθέτηση αντικειμένων

Ο τύπος του αντικειμένου δεν έχει σημασία στον έλεγχο εστίασης, οπότε τοποθετήστε τον κατάλληλα.

Είναι χρωματισμένο έτσι ώστε να είναι εύκολο να δείτε ότι είναι εστιασμένο.

Προς το παρόν, εάν το εκτελέσετε σε αυτήν την κατάσταση, μπορείτε να δείτε ότι εάν κάνετε κλικ σε ένα κενό μέρος αφού το αντικείμενο λάβει εστίαση, θα χάσει την εστίαση.

Έλεγχος για να μην χάσετε την εστίασή σας

Για να το κάνετε αυτό, δημιουργήστε μια δέσμη ενεργειών. Το όνομα του σεναρίου μπορεί να είναι οτιδήποτε, αλλά FocusRequired αφήστε το ως .

Εισαγάγετε τον κωδικό ως εξής:

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

Δεν θα μπω σε πολλές λεπτομέρειες, αλλά Αυτό που κάνω είναι να διατηρώ το τρέχον αντικείμενο επιλογής και εάν "το επιλεγμένο αντικείμενο έχει φύγει" ή "Έχω επιλέξει ένα αντικείμενο που δεν θέλω να επιλεγεί", επιστρέφω στην προηγούμενη επιλογή.

Αυτό το στοιχείο μπορεί να συνδεθεί με οποιοδήποτε αντικείμενο υπάρχει, επομένως EventSystem συνδέστε το στο .

Εφόσον είναι δυνατό να καθορίσετε το αντικείμενο που δεν θέλετε να επιλεγεί ως ιδιότητα, ας προσπαθήσουμε να τοποθετήσουμε ένα κουμπί που δεν θέλετε να επιλέξετε.

Not Selectables έχει οριστεί σε .

Δοκιμάστε να το εκτελέσετε για να δείτε πώς λειτουργεί. Πρώτα, κάντε κλικ σε ένα αντικείμενο για να το επιλέξετε και, στη συνέχεια, κάντε κλικ σε μια κενή περιοχή, ώστε να μην χάσει την εστίαση.

Μπορείτε επίσης να βεβαιωθείτε ότι κάνοντας κλικ σε ένα κουμπί που έχει οριστεί ως μη επιλεγμένο δεν μετακινείται η εστίαση.