Как выделить объект скриптом - Unity

Я новичок в 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");
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы бы использовали EventSystem.SetSelectedGameObject

EventSystem.current.SetSelectedGameObject(yourTargetGameObject);

Обратите внимание: ваша панель будет автоматически закрыта, даже если щелкнуть любой элемент пользовательского интерфейса внутри нее (например, InputField и т. д.)


Вы можете проверить исходный код TMP_Dropdown и то, как они реализовали «Блокировщик пользовательского интерфейса», который в основном представляет собой наложение на весь экран, кроме раскрывающегося всплывающего окна, и закрывает всплывающее окно при нажатии.

вы можете либо воспроизвести это, либо иметь более простую версию с полностью прозрачной фоновой кнопкой за панелью с onClick для закрытия панели.

В качестве альтернативы вы можете проверить RectTransformUtility.RectangleContainsScreenPoint

EventSystem.SetSelectedGameObject вроде работает, но выдает ошибку Attempting to select PhonePanel (UnityEngine.GameObject)while already selecting an object. Как решить эту ошибку?

Richard Johnson 02.10.2022 18:34

Что я сделал, так это заменил Select() на SelectedGameObject в методе OnEnable. И он возвращает эту ошибку. Что-то не так с размещением кода?

Richard Johnson 02.10.2022 18:49

Когда я помещаю null в SetSelectedGameObject, чтобы он мог сбросить выбранное, он возвращает ошибку Attempting to select while already selecting an object.. Я проверил сценарий, но он должен отправить OnDeselect на предыдущий выбранный объект, но он не работает.

Richard Johnson 03.10.2022 07:04

Я только что выбрал полностью прозрачную фоновую кнопку. Я не могу заставить SelectedGameObject работать.

Richard Johnson 03.10.2022 07:47

Я предполагаю, что это происходит потому, что OnEnable уже происходит как реакция на нажатие кнопки и, следовательно, Select этой кнопки в том же кадре ... хотя не знаю, как это преодолеть, за исключением задержки выбора кадром

derHugo 03.10.2022 17:30

Другие вопросы по теме