[RESOLU][MY-AL] upgrade de script sur Particle System

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

[RESOLU][MY-AL] upgrade de script sur Particle System

Message par qwerty31 » 31 Août 2017 09:36

Bonjour à tous !

J'ai un script très simple et qui fonctionne qui est le suivant :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ColorParticleModifier : MonoBehaviour {

	void Start () {
		GetComponentInChildren<ParticleSystem> ().startColor = GetComponent<Image> ().color;
	}
}
Cependant Unity me met un warning me disant que ce code est ancien et qu'il faudrait le mettre à jour : Assets/Scripts/Levels/ColorParticleModifier.cs(9,45): warning CS0618: `UnityEngine.ParticleSystem.startColor' is obsolete: `startColor property is deprecated. Use main.startColor instead.'

J'ai essayé cependant en suivant ce qu'Unity me disait, en faisant ceci :

Code : Tout sélectionner

		GetComponentInChildren<ParticleSystem> ().main.startColor = GetComponent<Image> ().color;
Sauf que j'obtient l'erreur suivante : Assets/Scripts/Levels/ColorParticleModifier.cs(9,50): error CS1612: Cannot modify a value type return value of `UnityEngine.ParticleSystem.main'. Consider storing the value in a temporary variable

Alors que je ne vois pas pourquoi je ne pourrai pas modifier cette valeur. (la doc me dit qu'on peut le faire.)

Une idée ?

Merci d'avance
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] upgrade de script sur Particle System

Message par boubouk50 » 31 Août 2017 09:59

D'après l'exemple de la doc, il te faut stocker le Main module dans une variable. L'accès direct depuis le Component est bloqué. Alors personnellement, je ne sais absolument pas pourquoi (si d'ailleurs quelqu'un pouvait l'expliquer svp) mais bon.
Essaie:

Code : Tout sélectionner

ParticleSystem.MainModule main = GetComponentInChildren<ParticleSystem> ().main;
main.startColor = GetComponent<Image> ().color;
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: [MY-AL] upgrade de script sur Particle System

Message par qwerty31 » 31 Août 2017 13:19

En effet ça marche, je n'ai plus d'erreur. C'est étonnant que le script ne marche pas par accès direct. Si quelqu'un sait pourquoi...?
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL] upgrade de script sur Particle System

Message par boubouk50 » 31 Août 2017 13:47

Si la solution est trouvée, merci de penser à le passer en RESOLU.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [RESOLU][MY-AL] upgrade de script sur Particle System

Message par simonj » 31 Août 2017 14:59

Salut,
boubouk50 a écrit :
31 Août 2017 09:59
[...] Alors personnellement, je ne sais absolument pas pourquoi (si d'ailleurs quelqu'un pouvait l'expliquer svp) mais bon. [...]
Je pense que l'explication serais que le "ParticleSystem.main" est une structure de donnée. Et une structure fonctionne par valeur et non pas référence. Je ne vais pas rentrer dans les détails car c'est assez complexe à expliquer (Une piste ici si tu veux mais en gros c'est dut au fait que quand tu fait "parent.structure", ça te renvoi une copie de la structure. Et donc si tu fais "parent.structure.x = y;" c'est pas la structure dans la classe qui est modifié mais la copie. Donc c'est plus une protection pour éviter que tu modifie un élément de la copie qui seras détruite juste après).
C'est pour ça que tu dois forcément stocker une référence sur la structure "ParticleSystem.main", changer ses valeurs et ensuite réassigner la référence.

C'est exactement le même principe que pour les Color. Essaye de faire :

Code : Tout sélectionner

GetComponent<Image> ().color.r = 1f;
Normalement il va te dire que c'est impossible de faire ça. Car Color n'est pas une classe mais une structure de donnée et ce n'est pas possible de changer les valeurs d'une structure dans cette configuration.

Les infos c'est là :
Structs vs. Classes
Structs may seem similar to classes, but there are important differences that you should be aware of. First of all, classes are reference types and structs are value types. By using structs, you can create objects that behave like the built-in types and enjoy their benefits as well.

Heap or Stack?
When you call the New operator on a class, it will be allocated on the heap. However, when you instantiate a struct, it gets created on the stack. This will yield performance gains. Also, you will not be dealing with references to an instance of a struct as you would with classes. You will be working directly with the struct instance. Because of this, when passing a struct to a method, it's passed by value instead of as a reference.

Répondre

Revenir vers « (C#) CSharp »