Как удалить динамически загруженные игровые объекты из списка в Untiy? - PullRequest
1 голос
/ 27 мая 2019

У меня есть список, который загружает его содержимое динамически.Элементы списка - это кнопки, которые превращаются в игровые объекты.Для каждого объекта в списке пользователей создается новый элемент.Теперь я хочу иметь возможность удалять элемент вместе с самой кнопкой, когда кнопка нажата, где каждый элемент имеет свою собственную динамически созданную кнопку удаления.Я попытался поместить коробочный коллайдер в событие 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);
}

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Прежде всего 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); });
}
0 голосов
/ 27 мая 2019

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

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

 void HandleCloseClick() {

     Destroy(gameObject);
 }

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...