نگه داشتن تمرکز خارج از شیء UI
محیط تایید
- ویندوز
-
- ویندوز 11
- ویرایشگر یونیتی
-
- دانلود: 2020.3.25f1
پیشنیازهای این نکته
تنظیمات زیر از قبل به عنوان پیش نیاز برای توضیح این نکات ساخته شده است.
چه چیزی در این نکته مفید بود؟
داستان اصلی جایی بود، اما من نمی توانستم ان را با جستجوی کلمات کلیدی پیدا کنم.
درباره تمرکز
اشیاء Ui Unity، مانند هر برنامه دیگری، می توانند تمرکز داشته باشند که نشان می دهد انها به عنوان اهداف ورودی فعال هستند. با این حال، اگر روی هر چیزی غیر از شی کلیک کنید یا لمس کنید، جسم با فوکوس ناپدید خواهد شد. ممکن است پذیرش عملیات با صفحه کلید یا گیم پد امکان پذیر نباشد.
این بخش نحوه استفاده از اسکریپت برای کنترل تمرکز را توضیح می دهد تا تمرکز را در یک شبه از دست ندهد. توجه داشته باشید که این پشتیبانی یک ویژگی 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
دکمه تنظیم شده .
سعی کنید ان را اجرا کنید تا ببینید چگونه کار می کند. ابتدا روی یک شی کلیک کنید تا ان را انتخاب کنید و سپس بر روی یک منطقه خالی کلیک کنید تا تمرکز خود را از دست ندهد.
شما همچنین می توانید اطمینان حاصل کنید که کلیک کردن بر روی یک دکمه که قرار است انتخاب نشود، تمرکز را حرکت نمی دهد.