J'ai remarqué ce comportement aussi, mais j'ai découvert ce qui se passe après avoir creusé plus profondément avec .NET Reflector.
L'exemple complet de votre code avec la dernière version Unity:
ParticleSystem particle = GetComponent<ParticleSystem>();
ParticleSystem.EmissionModule em = particle.emission;
em.rate = new ParticleSystem.MinMaxCurve(5);
choses à garder à l'esprit:
ParticleSystem
est un class
.
EmissionModule
est un struct
.
Pour modifier le taux d'émission de particules dans l'unité 5 et au-dessus, vous devez obtenir le ParticleSystem.emission
puis le stocker dans un EmissionModule
(struct), vous pouvez le modifier est rate
variable de
temporaire Comment ça marche?
Lorsque vous:
ParticleSystem particle = GetComponent<ParticleSystem>();
ou créer/instancier nouveau ParticleSystem
ou joindre un à l'éditeur, l'unité va créer nouvelle instance EmissionModule
. EmissionModule
a un constructeur internal
qui prend ParticleSystem
comme paramètre. Unity transmet immédiatement l'instance ParticleSystem
actuelle à ce constructeur EmissionModule
et cette instance est stockée dans une variable temporaire dans la structure EmissionModule
pour une utilisation ultérieure.
Il ressemble à ceci:
private ParticleSystem tempParticleSystem;
internal EmissionModule(ParticleSystem particleInstance)
{
this.tempParticleSystem = particleInstance;
}
Lorsque vous:
ParticleSystem.EmissionModule em = particle.emission;
unité créera une nouvelle instance de EmissionModule
de la particule en cours (particle
) et le retourner.Cela contiendra cette référence ParticleSystem
(tempParticleSystem) qui a été enregistrée. Rappelez-vous que ParticleSystem
est une classe, donc la référence est toujours là. La propriété emission
possède uniquement l'accesseur get
. No set
accesseur. Pour cette raison, il s'agit d'une propriété read uniquement.
La propriété emission
ressemble à ceci:
public EmissionModule emission
{
get
{
return new EmissionModule(this);
}
}
Enfin, lorsque le vous:
em.rate = ....
ou modifier le taux d'émission, qui a sauvé la référence est utilisé pour le changement le taux de particules dans le côté natif de Unity qui est écrit en C++.
public ParticleSystem.MinMaxCurve rate
{
get
{
ParticleSystem.MinMaxCurve curve = new ParticleSystem.MinMaxCurve();
getParticleRate(this.tempParticleSystem, ref curve);
return curve;
}
set
{
setParticleRate(this.tempParticleSystem, ref value);
}
}
Pour simplifier, on peut appeler cela un résultat d'une class
(ParticleSystem
) à l'intérieur d'un struct
(EmissionModule
).
Il est très difficile de dire sans un exemple complet - êtes-vous * certain * que 'EmissionModule' est une structure? Et que si vous utilisez 'Particle.emission.rate' vous verrez le nouveau taux? –
Oui, je suis certain, alors pourquoi je peux fournir leur type et décrire ce problème. – Developer
Comment avez-vous vérifié que la modification du «taux» modifie réellement le taux d'émission de «particules»? Que se passe-t-il si vous consignez les valeurs de 'Particle.emission.rate' avant et après le changement effectué? –