Voici une question très spécifique à laquelle j'ai eu du mal à répondre. J'ai un simple script qui crée/détruit un composant pendant veille/détruire dans le temps de l'exécution:Annuler la suppression de GameObject avec le script AddComponent dans Unity Editor (mode Lecture)
// Simple script that creates and destroys an AudioSource component in runtime.
public class SimpleScript : MonoBehaviour {
// Runtime AudioSource component to be used.
private AudioSource source = null;
void Awake() {
source = gameObject.AddComponent<AudioSource>();
source.hideFlags = HideFlags.HideAndDontSave;
}
void OnDestroy() {
Destroy(source);
}
void Update() {
// Do stuff with |source| . . .
}
}
Cependant, il fonctionne parfaitement bien avec la construction des exportations et tout, je l'ai remarqué récemment un cas très précis où agit l'unité un peu étrangement. Dans l'éditeur Unity (mode Lecture), si je supprime ce script (ou l'objet de jeu auquel le script est attaché), puis annulez l'opération, il en résulte deux AudioSource attachés à l'objet de jeu ressuscité. Plus précisement; un détruit par mon script précédemment avec l'opération de suppression + un créé avec le nouvel appel Awake. Et comme prévu, le faire à plusieurs reprises crée de plus en plus fuite des composants.
L'utilisation de différents HideFlags pour désactiver la sérialisation (?) Ne semble pas être utile, ni d'essayer DestroyImmediate etc. pour détruire le composant. Ma compréhension ici est que Unity traite le composant créé manuellement comme l'un des composants de GameObject, donc enregistre le détruire et l'annule en même temps que la suppression du script.
Des suggestions sur la façon de contourner/éviter ce comportement étrange de l'unité?
À la votre!
Si vous recréer GameObject, pourquoi ne pas simplement le désactiver et le réactiver? – bpgeck
Le problème ici est que vous n'avez pas le composant en premier lieu, c'est-à-dire que vous devez le créer quelque part dans le script afin de pouvoir l'activer/le désactiver. :) – anokta