Les composants de particule décrivent chaque particule individuelle : comment elle démarre, comment elle bouge, à quoi elle ressemble et quand elle disparaît. Ils se trouvent dans le bloc components d'un fichier de particule, à côté des composants d'émetteur qui les font apparaître.
Tu débutes avec les particules ? Ta première particule construit une étincelle de rubis à partir de zéro et utilise la plupart de ces composants.
Ce dont chaque particule a besoin
En pratique, chaque effet a besoin de particle_lifetime_expression (sinon les particules ne disparaissent jamais) et de particle_appearance_billboard (sinon il n'y a rien à voir). Tout le reste est facultatif et peut être combiné librement.
Les champs numériques acceptent un simple nombre ou une chaîne Molang. À l'intérieur, tu peux utiliser variable.particle_age, variable.particle_lifetime et variable.particle_random_1 à _4 pour donner à chaque particule sa propre personnalité.
État initial
Ces composants sont appliqués une seule fois, à la naissance de la particule.
| Composant | Ce qu'il fait | Champs clés |
|---|---|---|
minecraft:particle_initial_speed | La vitesse à laquelle la particule commence à bouger | Un nombre (blocs par seconde, dans la direction donnée par la forme de l'émetteur), ou une vitesse [x, y, z] |
minecraft:particle_initial_spin | L'angle de départ de l'image et sa vitesse de rotation | rotation : degrés (0 par défaut). rotation_rate : degrés par seconde (0 par défaut) |
minecraft:particle_initialization | Exécute ton propre Molang pour chaque particule, pour définir des variables lues par d'autres champs | per_update_expression : s'exécute à chaque mise à jour. per_render_expression : s'exécute à chaque fois qu'elle est dessinée |
La vitesse
"minecraft:particle_initial_speed": "math.random(1, 2)"Avec un seul nombre, la particule vole dans la direction que lui a donnée la forme de l'émetteur. Avec trois nombres, tu définis toi-même la vélocité, par exemple [0, 2, 0] pour monter tout droit. Sans ce composant, les particules démarrent immobiles.
La rotation
"minecraft:particle_initial_spin": {
"rotation": "math.random(0, 360)",
"rotation_rate": "math.random(-90, 90)"
}La rotation fait tourner l'image plate autour de son centre, comme une roue. Un angle de départ aléatoire est le moyen le plus simple d'éviter qu'une foule de particules ait l'air d'une série de copies.
Tes propres variables
"minecraft:particle_initialization": {
"per_render_expression": "variable.twinkle = math.sin(variable.particle_age * 720) * 0.5 + 0.5;"
}Maintenant, variable.twinkle oscille entre 0 et 1 deux fois par seconde, et tu peux t'en servir pour la taille ou la couleur. Pour une valeur qui suit une forme sur toute la durée de vie, une courbe est souvent plus simple.
Mouvement
Ces composants font bouger la particule à chaque image, après sa naissance.
| Composant | Ce qu'il fait | Champs clés |
|---|---|---|
minecraft:particle_motion_dynamic | Un vrai mouvement avec des forces : gravité, vent, résistance de l'air, accélération de la rotation | linear_acceleration, linear_drag_coefficient, rotation_acceleration, rotation_drag_coefficient |
minecraft:particle_motion_parametric | Tu définis la position exacte à chaque image avec du Molang, sans tenir compte des forces | relative_position, direction, rotation |
minecraft:particle_motion_collision | Permet aux particules de toucher les blocs : rebondir, glisser, s'arrêter ou disparaître | enabled, collision_radius, coefficient_of_restitution, collision_drag, expire_on_contact, events |
Dynamique
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -9.8, 0],
"linear_drag_coefficient": 0.5,
"rotation_acceleration": 0,
"rotation_drag_coefficient": 0
}| Champ | Ce qu'il fait |
|---|---|
linear_acceleration | Une poussée chaque seconde, sous la forme [x, y, z] en blocs par seconde par seconde. [0, -9.8, 0] donne une impression de chute. Un y positif fait monter la particule comme de la fumée |
linear_drag_coefficient | La résistance de l'air. Plus la particule va vite, plus elle ralentit fort. 0 veut dire aucune résistance |
rotation_acceleration | Accélère la rotation (ou la ralentit avec une valeur négative), en degrés par seconde par seconde |
rotation_drag_coefficient | Ralentit la rotation, pour qu'une particule qui tourne finisse par se stabiliser |
Le mouvement dynamique agit sur la vitesse de la particule, il se combine donc avec particle_initial_speed : démarre vite, puis laisse la gravité et la résistance prendre le relais.
Paramétrique
"minecraft:particle_motion_parametric": {
"relative_position": [
"math.cos(variable.particle_age * 360) * 0.8",
"variable.particle_age",
"math.sin(variable.particle_age * 360) * 0.8"
]
}Ici, tu laisses tomber la physique et tu dis simplement où se trouve la particule, par rapport à l'émetteur. Cet exemple fait un tour par seconde tout en montant d'un bloc par seconde : une spirale de rubis. direction et rotation se définissent de la même façon.
Le paramétrique a besoin d'un émetteur normal
Le mouvement paramétrique ne fonctionne pas pour les particules créées par emitter_rate_manual. Pour les effets attachés à une créature, il ne fonctionne que si l'émetteur utilise l'espace local pour sa position.
Collision
"minecraft:particle_motion_collision": {
"collision_radius": 0.1,
"coefficient_of_restitution": 0.4,
"collision_drag": 2,
"events": { "event": "pop", "min_speed": 2 }
}Sans ce composant, les particules traversent les blocs.
| Champ | Ce qu'il fait |
|---|---|
enabled | Active ou désactive la collision. Peut être du Molang, vérifié à chaque image. Activé par défaut |
collision_radius | La taille de la particule pour toucher les blocs. Doit être d'un demi-bloc ou moins. Fais-la correspondre à peu près à la taille du billboard |
coefficient_of_restitution | Le rebond. 0 s'arrête net, 1 rebondit à la même hauteur, entre les deux la particule perd un peu de hauteur à chaque rebond |
collision_drag | Ralentit la particule tant qu'elle touche une surface, en blocs par seconde. Elle glisse jusqu'à s'arrêter |
expire_on_contact | true supprime la particule dès qu'elle touche un bloc. Idéal pour des gouttes de pluie |
events | Déclenche l'un de tes événements quand elle touche quelque chose, par exemple une éclaboussure. Un objet événement ou une liste. min_speed (au moins 2 blocs par seconde) ignore les contacts légers |
La collision coûte en performances
Vérifier les blocs pour chaque particule demande du travail au jeu. N'ajoute la collision que là où la différence se voit, et garde un max_particles bas pour ces effets.
Apparence
Ces composants décident de l'apparence de la particule à l'écran.
| Composant | Ce qu'il fait | Champs clés |
|---|---|---|
minecraft:particle_appearance_billboard | Dessine la particule comme une image plate et décide de sa taille, de son orientation et de la partie de la texture qu'elle montre | size, facing_camera_mode, direction, uv |
minecraft:particle_appearance_tinting | Colore l'image, avec une seule couleur ou un dégradé dans le temps | color |
minecraft:particle_appearance_lighting | Rend la particule plus sombre dans les endroits sombres et plus claire à la lumière, comme les blocs | aucun : écris {} |
Billboard
"minecraft:particle_appearance_billboard": {
"size": [0.1, 0.1],
"facing_camera_mode": "lookat_xyz",
"uv": {
"texture_width": 32,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [8, 8]
}
}size vaut [width, height] et est vérifié à chaque image, donc du Molang ici peut faire grandir ou rétrécir la particule. Chaque valeur se mesure depuis le centre, donc 0.5 donne un carré d'un bloc de large.
facing_camera_mode décide de l'orientation de l'image plate :
| Mode | L'image |
|---|---|
lookat_xyz | Fait toujours face à la caméra, mais reste droite. Le choix habituel |
rotate_xyz | Reste à plat contre l'écran et tourne avec la caméra |
lookat_y / rotate_y | Fait face à la caméra mais ne tourne que vers la gauche et la droite, comme une silhouette en carton posée au sol |
lookat_direction | Fait face à la caméra tout en s'alignant sur la direction de la particule. Idéal pour des traînées |
direction_x / direction_y / direction_z | Oriente le côté x, le côté y ou la face de l'image selon la direction de la particule |
emitter_transform_xy / _xz / _yz | Reste à plat dans un plan de l'émetteur. _xz crée un décalque plat sur le sol |
Les modes de direction ont besoin de savoir dans quelle direction pointe la particule. Définis-la avec direction :
"direction": {
"mode": "derive_from_velocity",
"min_speed_threshold": 0.01
}derive_from_velocity utilise le sens de déplacement de la particule, mais seulement tant qu'elle va plus vite que min_speed_threshold. Utilise "mode": "custom_direction" avec "custom_direction": [x, y, z] pour la définir toi-même.
uv choisit la partie de la texture à afficher. texture_width et texture_height sont la taille de ton PNG en pixels, puis uv est le coin supérieur gauche et uv_size la largeur et la hauteur de la partie voulue. L'exemple ci-dessus affiche la première image de 8x8 d'une bande de 32x8.
Animation en flipbook
Place plusieurs images côte à côte et le billboard peut les jouer comme un folioscope. Remplace uv et uv_size par flipbook :
"uv": {
"texture_width": 32,
"texture_height": 8,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [8, 0],
"max_frame": 4,
"stretch_to_lifetime": true,
"loop": false
}
}| Champ | Ce qu'il fait |
|---|---|
base_UV | Le coin supérieur gauche de la première image |
size_UV | La largeur et la hauteur d'une image |
step_UV | De combien se décaler pour l'image suivante. [8, 0] avance vers la droite |
max_frame | Le nombre d'images (la première est l'image 1) |
frames_per_second | La vitesse de lecture |
stretch_to_lifetime | true ignore la vitesse et joue toutes les images exactement une fois sur la durée de vie de la particule |
loop | true recommence à la première image après la dernière |
Une étincelle de rubis en 4 images qui s'ouvre, brille et se referme paraît bien plus vivante qu'une seule image.
Teinte
"minecraft:particle_appearance_tinting": {
"color": [1, 0.15, 0.3, 1]
}La couleur multiplie la texture, alors dessine tes textures de particules en blanc ou en gris et laisse la teinte ajouter la couleur. Tu peux écrire une couleur de plusieurs façons :
| Forme | Exemple |
|---|---|
[r, g, b] ou [r, g, b, a], chacun de 0 à 1 | [1, 0.15, 0.3, 1] |
"#RRGGBB" | "#FF2650" |
"#AARRGGBB" (alpha en premier) | "#80FF2650" est à moitié transparent |
| Du Molang dans chaque case | ["variable.tint.r", "variable.tint.g", "variable.tint.b", 1] |
Pour changer de couleur dans le temps, utilise un dégradé. Les couleurs sont réparties uniformément, et interpolant indique où se trouve la particule sur le dégradé à cet instant :
"minecraft:particle_appearance_tinting": {
"color": {
"gradient": {
"0.0": "#FFFFFFFF",
"0.3": "#FFFF2650",
"1.0": "#00600018"
},
"interpolant": "variable.particle_age / variable.particle_lifetime"
}
}Écrite sous forme d'objet comme ici, chaque couleur se place au point que tu indiques. Une simple liste les répartit plutôt uniformément de 0 à 1. Cette étincelle clignote en blanc, devient rouge rubis assez tôt, puis s'efface lentement.
L'alpha a besoin du bon matériau
Les couleurs semi-transparentes ne s'affichent qu'avec le matériau particles_blend ou particles_add. Avec particles_alpha, un pixel est soit entièrement affiché, soit entièrement caché.
Éclairage
"minecraft:particle_appearance_lighting": {}Avec ce composant, les particules paraissent plus sombres dans les grottes et la nuit, pour bien s'intégrer au monde. Ne le mets pas pour ce qui doit briller dans le noir : la magie, le feu, notre étincelle de rubis.
Durée de vie
Ces composants décident du moment où une particule disparaît.
| Composant | Ce qu'il fait | Champs clés |
|---|---|---|
minecraft:particle_lifetime_expression | La durée de vie principale : un temps fixe, ou un test Molang vérifié à chaque image | max_lifetime, expiration_expression |
minecraft:particle_lifetime_events | Déclenche tes événements à certains moments de la vie de chaque particule | creation_event, expiration_event, timeline |
minecraft:particle_kill_plane | Supprime les particules qui traversent une surface plate invisible | [A, B, C, D] |
minecraft:particle_expire_if_in_blocks | Supprime les particules qui se trouvent dans l'un des blocs listés | Une liste de noms de blocs |
minecraft:particle_expire_if_not_in_blocks | Supprime les particules qui sortent des blocs listés | Une liste de noms de blocs |
Expression de durée de vie
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(0.8, 1.5)"
}max_lifetimeest la durée de vie en secondes, choisie une fois à la naissance de la particule.expiration_expressionest vérifiée à chaque image. Quand elle ne vaut pas 0, la particule disparaît. Par exemple,"variable.particle_age > 1 && query.is_in_water"pourrait la faire disparaître plus tôt.
Tu peux utiliser les deux ensemble : la particule disparaît dès que l'une des deux conditions est remplie.
Événements de durée de vie
"minecraft:particle_lifetime_events": {
"creation_event": "flash",
"expiration_event": "pop",
"timeline": {
"0.25": "twinkle"
}
}Les noms renvoient au bloc events du même fichier, et chaque champ accepte un nom ou une liste. Contrairement à la version de l'émetteur, ils se déclenchent pour chaque particule, donc une salve de 12 étincelles déclenche pop 12 fois. Voir les événements pour savoir ce qu'un événement peut faire.
Plan de suppression
"minecraft:particle_kill_plane": [0, 1, 0, 0.5]Les quatre nombres décrivent une surface plate à la façon des maths : tous les points où A*x + B*y + C*z + D = 0, mesurés depuis l'émetteur mais alignés sur le monde. Les particules qui la traversent disparaissent. [0, 1, 0, 0.5] est un sol situé un demi-bloc sous l'émetteur. C'est un moyen peu coûteux d'arrêter des particules qui tombent, sans collision.
Dans des blocs et hors des blocs
"minecraft:particle_expire_if_not_in_blocks": [
"minecraft:water",
"minecraft:flowing_water",
"minecraft:bubble_column"
]C'est comme ça que les bulles éclatent en atteignant la surface : elles ne vivent que tant qu'elles sont dans l'eau. Utilise particle_expire_if_in_blocks pour l'inverse, par exemple de la poussière qui disparaît dès qu'elle dérive dans l'eau. Les deux fonctionnent avec particle_lifetime_expression.
Une particule complète
Les quatre groupes réunis. Voici le côté particule d'un éclat de rubis qui tombe, rebondit et s'efface :
"minecraft:particle_initial_speed": "math.random(2, 3)",
"minecraft:particle_initial_spin": {
"rotation": "math.random(0, 360)",
"rotation_rate": 180
},
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -9.8, 0],
"rotation_drag_coefficient": 1
},
"minecraft:particle_motion_collision": {
"collision_radius": 0.05,
"coefficient_of_restitution": 0.3,
"collision_drag": 4
},
"minecraft:particle_appearance_billboard": {
"size": [0.06, 0.06],
"facing_camera_mode": "lookat_xyz",
"uv": {
"texture_width": 8,
"texture_height": 8,
"uv": [0, 0],
"uv_size": [8, 8]
}
},
"minecraft:particle_appearance_tinting": {
"color": "#FFE0204A"
},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 2
}Donne-lui un émetteur tiré des Composants d'émetteur, par exemple une salve de 8 depuis une petite sphère, et tu obtiens un super effet de bloc qui se casse.