Les animations font bouger une créature. Un contrôleur de rendu (render controller) décide avec quoi la créature est dessinée : quel modèle, quelle texture et quel matériau. Il peut aussi cacher des parties du modèle. Dans ce guide, notre golem de rubis reçoit trois couleurs de gemme et une couronne qu'il ne porte que de temps en temps.
Les contrôleurs de rendu se trouvent dans le pack de ressources. Comme les animations, ils changent seulement l'apparence d'une créature.
Les fichiers
RP/
entity/
ruby_golem.entity.json
render_controllers/
ruby_golem.render_controllers.json
textures/
entity/
ruby_golem/
red.png
pink.png
dark.pngEn as-tu vraiment besoin ?
Beaucoup de créatures ont un seul modèle et un seul skin. Pour elles, utilise le contrôleur vanilla controller.render.default. Il dessine la géométrie, la texture et le matériau qui s'appellent tous default dans ton entité client, et tu n'as aucun fichier à écrire. Ta première créature personnalisée fait exactement ça.
Il te faut ton propre contrôleur de rendu quand :
- la créature a plusieurs textures au choix, comme des couleurs ou des skins,
- la créature change de modèle, comme un mouton qui perd sa laine,
- des parties du modèle doivent apparaître ou disparaître, comme une selle ou une armure,
- la créature doit être teintée d'une couleur.
Les noms courts viennent de l'entité client
Un contrôleur de rendu n'utilise jamais de chemins de fichiers. Il utilise les noms courts que tu as donnés dans l'entité client, précédés d'un préfixe :
| Dans l'entité client | Dans le contrôleur de rendu |
|---|---|
"geometry": { "default": "geometry.wiki.ruby_golem" } | geometry.default |
"textures": { "red": "textures/entity/ruby_golem/red" } | texture.red |
"materials": { "default": "entity_alphatest" } | material.default |
Donc texture.red veut dire « la texture que j'ai appelée red dans l'entité client ».
Étape 1 : le contrôleur le plus simple
Les fichiers de contrôleurs de rendu vont dans le dossier render_controllers :
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.ruby_golem": {
"geometry": "geometry.default",
"materials": [{ "*": "material.default" }],
"textures": ["texture.red"]
}
}
}Les trois parties principales :
| Champ | Ce qu'il contient |
|---|---|
geometry | Un modèle. Une seule valeur, pas une liste. |
materials | Une liste qui associe des os à des matériaux. * veut dire tous les os. |
textures | Une liste de textures. La plupart des créatures n'en ont besoin que d'une. |
Le nom doit commencer par controller.render.. Ensuite, ajoute-le dans l'entité client :
"render_controllers": ["controller.render.ruby_golem"]Étape 2 : trois couleurs de gemme
Passons à la partie amusante. D'abord, liste les trois textures dans l'entité client :
"textures": {
"red": "textures/entity/ruby_golem/red",
"pink": "textures/entity/ruby_golem/pink",
"dark": "textures/entity/ruby_golem/dark"
}Puis mets-les dans un tableau (array) dans le contrôleur de rendu et choisis-en une avec Molang :
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.ruby_golem": {
"arrays": {
"textures": {
"array.gem_colors": [
"texture.red",
"texture.pink",
"texture.dark"
]
}
},
"geometry": "geometry.default",
"materials": [{ "*": "material.default" }],
"textures": ["array.gem_colors[query.variant]"]
}
}
}array.gem_colors[query.variant] veut dire « prends l'élément numéro query.variant dans la liste ». On commence à compter à 0, donc la variante 0 est rouge, la 1 est rose et la 2 est sombre.
D'où vient query.variant ?
Du pack de comportements. Le composant minecraft:variant stocke un nombre sur la créature, et query.variant le lit. Ici, chaque golem choisit une couleur au hasard quand il apparaît :
"component_groups": {
"wiki:color_red": { "minecraft:variant": { "value": 0 } },
"wiki:color_pink": { "minecraft:variant": { "value": 1 } },
"wiki:color_dark": { "minecraft:variant": { "value": 2 } }
},
"events": {
"minecraft:entity_spawned": {
"randomize": [
{ "weight": 2, "add": { "component_groups": ["wiki:color_red"] } },
{ "weight": 1, "add": { "component_groups": ["wiki:color_pink"] } },
{ "weight": 1, "add": { "component_groups": ["wiki:color_dark"] } }
]
}
}Le rouge a un poids de 2, donc il apparaît deux fois plus souvent que chacune des autres couleurs.
Dépasser la liste n'est pas une erreur
Si le nombre est plus grand que la liste, on repart du début : dans une liste de 3, le numéro 3 reprend l'élément 0. Les nombres négatifs prennent l'élément 0. Une mauvaise variante affiche donc la mauvaise couleur, sans faire planter le jeu.
Des tableaux pour les modèles et les matériaux aussi
arrays peut contenir trois sortes de listes. Chaque liste ne peut contenir qu'une seule sorte de chose :
| Clé dans arrays | Contient | Exemple d'élément |
|---|---|---|
textures | Des textures | texture.red |
materials | Des matériaux | material.default |
geometries | Des modèles | geometry.default |
Tu n'as pas toujours besoin d'un tableau. Pour un simple choix entre deux options, un ternaire Molang suffit :
"geometry": "query.is_baby ? geometry.small : geometry.default"Étape 3 : cacher et afficher des parties
part_visibility active et désactive des os. Notre golem a un os crown qu'il n'affiche que lorsqu'il est apprivoisé :
"part_visibility": [
{ "*": true },
{ "crown": "query.is_tamed" }
]- Chaque entrée est un nom d'os et une valeur.
trueou tout ce qui n'est pas 0 l'affiche,falseou 0 le cache. - Cacher un os cache aussi ses enfants.
- Les entrées s'appliquent dans l'ordre, donc les dernières l'emportent. Ici, tout est d'abord affiché, puis la couronne dépend de la requête.
*sert de joker :"gem_*"correspond àgem_left,gem_right, etc.
La liste materials marche de la même façon : commence par { "*": ... } pour tout, puis remplace des os précis juste après.
"materials": [
{ "*": "material.default" },
{ "core": "material.glow" }
]Pour que ça marche, glow doit être un nom court dans les materials de l'entité client, qui pointe vers un vrai matériau lumineux, comme entity_emissive_alpha.
Couleurs et effets
Un contrôleur de rendu peut aussi changer les couleurs. Tous ces champs sont facultatifs :
| Champ | Ce qu'il fait |
|---|---|
color | Teinte la créature. Il faut un matériau qui accepte la teinte. |
overlay_color | Peint une couleur sur toute la créature, avec a comme intensité |
is_hurt_color | Le flash quand la créature prend des dégâts. En vanilla, il est rouge. |
on_fire_color | La teinte quand elle brûle |
ignore_lighting | true dessine la créature en pleine lumière, même la nuit |
uv_anim | Fait glisser la texture au fil du temps avec offset et scale, pour des effets qui coulent |
Chaque couleur a r, g, b et a de 0 à 1, et chacun peut être du Molang :
"overlay_color": {
"r": 1.0,
"g": 1.0,
"b": 1.0,
"a": "variable.is_shouting ? 0.5 : 0.0"
}Plusieurs contrôleurs
render_controllers dans l'entité client est une liste. Chaque contrôleur dessine la créature une fois avec son propre modèle, tu peux donc les empiler. Le jeu vanilla s'en sert pour des couches comme l'armure ou les yeux lumineux.
Tu peux aussi ajouter une condition pour qu'un contrôleur ne dessine que de temps en temps :
"render_controllers": [
"controller.render.ruby_golem",
{ "controller.render.ruby_golem_shine": "query.is_powered" }
]Quand quelque chose ne marche pas
| Ce que tu vois | Cause la plus probable |
|---|---|
| La créature est invisible | Le nom du contrôleur de rendu dans l'entité client contient une faute de frappe, ou le fichier n'est pas dans render_controllers |
| Un damier noir et violet | Le nom court de la texture ou son chemin est faux, ou le chemin se termine par .png |
| Tous les golems sont rouges | Le pack de comportements ne définit jamais minecraft:variant, donc query.variant vaut 0 |
| Une partie cachée reste visible | Une entrée part_visibility plus loin la réactive, comme un * placé en dernier |
| La teinte ne fait rien | Le matériau n'accepte pas la teinte. Essaie un matériau vanilla prévu pour ça |
Tu trouveras plus d'aide dans Dépannage.
Et ensuite
- Fais bouger la créature avec les Animations d'entité.
- Joue des sons et des particules depuis les animations avec les Événements d'animation.
- Peins de plus beaux skins avec les Textures pixel art.