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





Прежде всего, 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 ;)
Ой? where each Element has its own dynamically created delete button. Я подумал, что это был объект, который ОП хотел уничтожить. В заголовке также упоминается список, но его нет в вопросе, но это всего лишь строка перед «Уничтожить», в худшем случае.
Это элементы пользовательского интерфейса? Кнопка и т. д.