فوکس کو یو آئی آبجیکٹ سے باہر رکھنا

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2020.3.25f1

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات ان تجاویز کی وضاحت کے لئے ایک شرط کے طور پر پیشگی کی گئی ہیں.

آپ کو اس ٹوٹکے میں کیا مددگار لگا؟

اصل کہانی کہیں نہ کہیں تھی ، لیکن میں مطلوبہ الفاظ تلاش کرکے اسے تلاش نہیں کر سکا۔

فوکس کے بارے میں

یونٹی یو آئی آبجیکٹس ، کسی بھی دوسری ایپ کی طرح ، ایک فوکس ہوسکتا ہے جو اس بات کی نشاندہی کرتا ہے کہ وہ ان پٹ اہداف کے طور پر فعال ہیں۔ تاہم ، اگر آپ آبجیکٹ کے علاوہ کسی اور چیز پر کلک یا ٹچ کرتے ہیں تو ، فوکس والی آبجیکٹ غائب ہوجائے گی۔ کی بورڈ یا گیم پیڈ کے ساتھ کارروائیوں کو قبول کرنا ممکن نہیں ہوسکتا ہے۔

یہ سیکشن بیان کرتا ہے کہ فوکس کو کنٹرول کرنے کے لئے اسکرپٹنگ کا استعمال کیسے کیا جائے تاکہ یہ جعلی میں توجہ نہ کھوئے۔ نوٹ کریں کہ یہ حمایت اتحاد کی خصوصیت نہیں ہے اور آپ کو ایک لمحے کے لئے توجہ کھونے کا سبب بن سکتی ہے۔

آبجیکٹ کی جگہ

فوکس کنٹرول میں آبجیکٹ کی قسم سے کوئی فرق نہیں پڑتا ہے ، لہذا اسے مناسب طریقے سے رکھیں۔

یہ رنگین ہے تاکہ یہ دیکھنا آسان ہو کہ یہ فوکس میں ہے۔

فی الحال ، اگر آپ اسے اس حالت میں چلاتے ہیں تو ، آپ دیکھ سکتے ہیں کہ اگر آپ آبجیکٹ کو فوکس حاصل کرنے کے بعد کسی خالی جگہ پر کلک کرتے ہیں تو ، وہ توجہ کھو دے گا۔

کنٹرول کریں تاکہ آپ توجہ نہ کھوئیں

ایسا کرنے کے لئے ، ایک اسکرپٹ بنائیں۔ اسکرپٹ کا نام کچھ بھی ہوسکتا ہے ، لیکن 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 بٹن سیٹ کیا گیا ہے۔

یہ دیکھنے کے لئے اسے چلانے کی کوشش کریں کہ یہ کیسے کام کرتا ہے۔ سب سے پہلے ، کسی شے کو منتخب کرنے کے لئے اس پر کلک کریں ، اور پھر کسی خالی علاقے پر کلک کریں تاکہ وہ توجہ کھو نہ دے۔

آپ اس بات کو بھی یقینی بنا سکتے ہیں کہ غیر منتخب ہونے کے لئے مقرر کردہ بٹن پر کلک کرنے سے توجہ منتقل نہیں ہوتی ہے۔