Как удалить динамически загруженные игровые объекты из списка в Untiy?

У меня есть список, который динамически загружает его содержимое. Элементы списка — это кнопки, которые трансформируются в игровые объекты. Для каждого объекта в пользовательском списке создается новый элемент. Теперь я хочу иметь возможность удалить элемент вместе с самой кнопкой при нажатии кнопки, где каждый элемент имеет свою собственную динамически созданную кнопку удаления. Я попытался поместить коллайдер коробки с событием OnMouseDown, однако onMouseDown никогда не вызывается.

public void ShowLectures()
{
    foreach (var course in selectedCourses)
    {
        AddMoreButton();
    }
}

public void AddMoreButton()
{
    GameObject button = (GameObject)Instantiate(prefabButton);
    button.transform.SetParent(panel.transform, false);
    button.layer = 5;
    button.SetActive(true);
}

public void OnMouseDown()
{
    Destroy(gameObject);
}

Это элементы пользовательского интерфейса? Кнопка и т. д.

Fredrik Schön 27.05.2019 19:44

Да, это все элементы пользовательского интерфейса

softwareUser 27.05.2019 19:47
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Прежде всего, OnMouseDown вызывается не для созданного Button, а в вашем случае скорее для GameObject, к которому прикреплен ваш скрипт.

потом

Destroy(gameObject);

таким же образом будет уничтожен GameObject, к которому прикреплен ваш скрипт, а не созданные экземпляры button GameObjects.


Поскольку вы отметили, что используете компонент UI.Button, скорее добавьте его в событие onClick в качестве обратного вызова при создании экземпляра Button:

public void AddMoreButton()
{
    GameObject button = (GameObject)Instantiate(prefabButton);
    button.transform.SetParent(panel.transform, false);
    button.layer = 5;
    button.SetActive(true);

    // get the Button on the button object or any child
    var buttonInstance = button.GetComponentInChildren<Button>();

    // add a callback to destroy the button gameObject
    // () => {} is a lambda expression
    buttonInstance.onClick.AddCallback(()=>{ Destroy(button); });
}

Небольшой совет: если Button уже находится в том же GameObject, вам все равно следует изменить сам тип префаба на Button, например,

public Button prefabButton;

а чем просто использовать

public void AddMoreButton()
{
    Button button = Instantiate(prefabButton, panel.transform);
    button.gameObject.layer = 5;
    button.gameObject.SetActive(true);

    // add a callback to destroy the button gameObject
    // () => {} is a lambda expression
    button.onClick.AddListener(()=>{ Destroy(button.gameObject); });
}

Вместо создания игрового объекта с OnMouseDown я бы, вероятно, создал кнопку и привязал к ней событие:

 var closeButton = /* Dynamically create button */
 closeButton.GetComponent<Button>().onClick.AddListener(HandleCloseClick);

 void HandleCloseClick() {

     Destroy(gameObject);
 }

Однако вы можете использовать уже реализованную архитектуру — вам просто нужно реализовать IPointerClickHandler.

Вот ответ, описывающий, как реализовать и использовать интерфейс.

Проверьте документы для получения инструкций о том, как использовать каждое событие (мышь вниз, вверх, ввод, выход).

Обратите внимание, что это все равно Destroy(gameObject) ... gameObject (игровой объект, к которому прикреплен скрипт) — это не то, что вы хотите уничтожить, а созданный экземпляр button GameObject ;)

derHugo 27.05.2019 20:10

Ой? where each Element has its own dynamically created delete button. Я подумал, что это был объект, который ОП хотел уничтожить. В заголовке также упоминается список, но его нет в вопросе, но это всего лишь строка перед «Уничтожить», в худшем случае.

Fredrik Schön 27.05.2019 21:10

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