Tentative de suppression des éléments du panneau (videz-le), puis remplissez à nouveau le panneau avec de nouveaux éléments (boutons)
J'ai déjà essayé de supprimer chaque élément avec le foreach que vous voyez ci-dessous sans succès
public GameObject Button; public Transform buttonContainer; public void create_buttons(Orbital o) { GameObject go = Instantiate(Button); var panel = GameObject.Find("station_panel"); //Destroy(GameObject.Find("station_panel")); foreach (UnityEngine.UI.Button b in panel.GetComponents<UnityEngine.UI.Button>()) { //Destroy(b.gameObject); b.enabled = false; } go.transform.position = panel.transform.position; go.GetComponent<RectTransform>().SetParent(panel.transform); //go.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 10); go.GetComponent<UnityEngine.UI.Button>().onClick.AddListener(() => onClick()); go.GetComponentInChildren<Text>().text = o.name; } void onClick() { Debug.Log("aaaaaaaaaaaaaaa"); canvas.enabled = false; }
3 Réponses :
Faites une liste et ajoutez n'importe quel bouton que vous créez pour votre panneau.
Une fois que vous voulez l'effacer, effacez cette liste, mais GetCompoenents ne renverra pas tous les boutons de votre objet de jeu Panel car vous ne pouvez pas ajouter un composant à 2 boutons à un seul objet de jeu.
Ajoutez également -en utilisant UnityEngine.UI- en haut de votre script pour être facilement lu pour être comme
foreach (Button b in list) { Destroy(b.gameObject); }
Si vous faites cela (ce qui est une alternative valide à l'autre réponse), assurez-vous de faire également list.Clear();
ensuite pour supprimer également toutes les entrées pour les références aux objets détruits qui sont maintenant null
bits null
toujours là.
Transform panelTransform = GameObject.Find("station_panel").transform; foreach(Transform child in panelTransform) { Destroy(child.gameObject); }
Je pense que vous voulez dire Destroy(child.gameObject);
Je recommanderais également de ne pas utiliser Find
mais plutôt de stocker la référence la première fois qu'elle a été appelée, par exemple, comme private GameObject panel; private Transform GetPanelTransform { get { if(!panel) { panel = Find("station_panel"); } return panel.transform; } }
. Ou ne pas utiliser Find
du tout et plutôt lier la référence dans l'inspecteur en utilisant [SerializeField] private Transform panelTransform;
@derHugo Aussi ça, mais je n'allais pas entrer ici. Tout ce que je voulais montrer, c'était que la hiérarchie des transformations était traversable.
DestroyImmediate (i-am-gameobject);
Cela ne répond pas à la question. Une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel message ; à la place, fournissez des réponses qui ne nécessitent pas de clarification de la part du demandeur . - De l'avis
Pouvez-vous préciser ce que vous attendez de votre code et ce qui se passe à la place? Ce n'est pas encore tout à fait clair d'après votre question.
Il y a un panneau. J'y ajoute des boutons dynamiquement. Ça arrive. Mais à chaque itération, de nouveaux boutons sont ajoutés au panneau, dupliquant essentiellement les anciens. Je veux d'abord vider / détruire ce qui se trouve dans le panneau, puis y ajouter à nouveau des boutons. Quelque chose comme initialiser le panneau à un panneau vide (btw ne peut pas détruire le panneau), puis le repeupler
Btw au lieu de la boucle
foreach
, vous pouvez simplement rendre le champ prefab de typepublic Button Button;
. alors vous obtiendrez le composant directement à partir deButton go = Instantiate (Button, panel.transform); go.enabled = false;
et vous pouvez également ignorer les deux lignes suivantesgo.transform.position = panel.transform.position; go.GetComponent<RectTransform>().SetParent(panel.transform);