2016-10-19 1 views
2

Le code ci-dessous fonctionne, "Particle" est une instance de la classe "ParticleSystem".Comprendre le "Struct" dans Unity ParticleSystem

"Particle.emission" est un rendez-vous seule propriété struct retour "ParticleSystem.EmissionModule"

"em.rate" est une propriété, le type est struct "ParticleSystem.MinMaxCurve"

ParticleSystem.EmissionModule em = Particle.emission; 
em.rate = new ParticleSystem.MinMaxCurve(5); 

Mon problème est, pourquoi le code ci-dessus peut changer le taux dans l'instance "Particle"?

Notez le struct est pas référence, donc il ne peut pas être modifié directement, ou il fera CS1612

Actuellement, je suppose struct « ParticleSystem.EmissionModule » stocké quelques références qui peuvent lier ou se rapportent à l'original "Particle" instance?

+0

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? –

+0

Oui, je suis certain, alors pourquoi je peux fournir leur type et décrire ce problème. – Developer

+0

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é? –

Répondre

4

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).

+0

Merci, c'est aussi ce que j'ai deviné avant, struct "EmissionModule" stocke la référence de la classe de particules! – Developer

+0

Yup c'était la première chose que je pensais aussi. Je voulais vérifier avant de poster et il s'avère être vrai après avoir utilisé Reflector pour le vérifier. – Programmer