- Home /
Destroy doesn't work when also instantiating new objects
I got this function to create a few button elements:
//Keep track of added perk buttons
List<GameObject> displayedPerkButtons = new List<GameObject>();
//Adds perk buttons based on the current chosenPerks.
void PopulatePerkChooser()
{
//Removes any old perk buttons if present
if (displayedPerkButtons.Count > 0)
{
for (int i = 0; i < displayedPerkButtons.Count; i++)
{
Destroy(displayedPerkButtons[i].gameObject);
}
displayedPerkButtons.Clear();
}
//For each perk in chosenPerks, instantiate a new PerkButton, run its construct function passing along the specific perk, and add it to the displayedPerkButtons list for future removal
for (int i = 0; i < PerkManager.Instance.chosenPerks.Count; i++)
{
GameObject newPerkButton = Instantiate(perkTemplate, perkButtonContainer.transform);
newPerkButton.GetComponent<PerkButton>().ConstructPerkButton(PerkManager.Instance.chosenPerks[i]);
displayedPerkButtons.Add(newPerkButton);
}
//Constructs "Random perk" button at the end, and add this as well to displayedPerkButtons
GameObject randomPerkButton = Instantiate(randomPerkTemplate, perkButtonContainer.transform);
displayedPerkButtons.Add(randomPerkButton);
}
It generates the buttons just fine, but it fails to destroy any old buttons if it is run more than once. Interestingly, if I make a second function that only contains the removal part, and run that separately after the first function, it removes the buttons as intended - so something seems to be wrong with how it interacts with the creation of the new buttons.
What might I be missing here?
You could try using DestroyImmediate ins$$anonymous$$d of Destroy.
I did try that, but it doesn't work either - in theory I'd think it would work either way since it's not trying to get children or anything like that, but it doesn't seem to.
Answer by ivarhill · Mar 09, 2019 at 08:45 PM
Turns out the issue was due to the list of actual buttons to use - that list didn't clear properly so it added copies of the same buttons to replace the deleted ones.
Your answer
![](https://koobas.hobune.stream/wayback/20220612193259im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
using Contains(gameObject) to find and destroy a gameObject from a list 2 Answers
Store Game Object Into List For Later Reinstantiation? 0 Answers
Destroy the current GameObject? 7 Answers
"Destroy assets is not permitted to avoid data loss" 2 Answers
Destroying childs and Instantiate [C#] 0 Answers