Я новичок в Unity и сейчас делаю простую игру. У меня проблема, когда мне нужно автоматически выбрать объект с помощью скрипта, чтобы я мог щелкнуть за его пределами, не щелкая его на экране.
Что я хочу сделать, так это то, что когда я нажимаю на объект, будет отображаться другой объект или панель, и он будет автоматически выбран сценарием, поэтому я могу щелкнуть за пределами панели, и она закроется или будет setActive to false. Я попробовал Select(), и это не работает для меня. Два объекта изначально являются Image, но я добавил компонент Button, чтобы его можно было выбрать.
Это скрипт для объекта, который будет отображать панель:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class ShowPhone : MonoBehaviour, ISelectHandler
{
[SerializeField] Button phonePanel;
public void OnSelect(BaseEventData eventData)
{
phonePanel.gameObject.SetActive(true);
}
}
Это скрипт для панели, где я хочу щелкнуть снаружи, чтобы закрыть ее:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class HidePhoen : MonoBehaviour, IDeselectHandler
{
public Button phone;
private void OnEnable()
{
phone.Select();
}
public void OnDeselect(BaseEventData data)
{
Debug.Log("The Object will be setActive false when clicked outside the object");
}
}





Вы бы использовали EventSystem.SetSelectedGameObject
EventSystem.current.SetSelectedGameObject(yourTargetGameObject);
Обратите внимание: ваша панель будет автоматически закрыта, даже если щелкнуть любой элемент пользовательского интерфейса внутри нее (например, InputField и т. д.)
Вы можете проверить исходный код TMP_Dropdown и то, как они реализовали «Блокировщик пользовательского интерфейса», который в основном представляет собой наложение на весь экран, кроме раскрывающегося всплывающего окна, и закрывает всплывающее окно при нажатии.
вы можете либо воспроизвести это, либо иметь более простую версию с полностью прозрачной фоновой кнопкой за панелью с onClick для закрытия панели.
В качестве альтернативы вы можете проверить RectTransformUtility.RectangleContainsScreenPoint
Что я сделал, так это заменил Select() на SelectedGameObject в методе OnEnable. И он возвращает эту ошибку. Что-то не так с размещением кода?
Когда я помещаю null в SetSelectedGameObject, чтобы он мог сбросить выбранное, он возвращает ошибку Attempting to select while already selecting an object.. Я проверил сценарий, но он должен отправить OnDeselect на предыдущий выбранный объект, но он не работает.
Я только что выбрал полностью прозрачную фоновую кнопку. Я не могу заставить SelectedGameObject работать.
Я предполагаю, что это происходит потому, что OnEnable уже происходит как реакция на нажатие кнопки и, следовательно, Select этой кнопки в том же кадре ... хотя не знаю, как это преодолеть, за исключением задержки выбора кадром
EventSystem.SetSelectedGameObjectвроде работает, но выдает ошибкуAttempting to select PhonePanel (UnityEngine.GameObject)while already selecting an object.Как решить эту ошибку?