Modifier la couleur d’un élément en C# avec Godot

Ma Motivation 💪
61%

1. Modifier la couleur avec l'inspecteur Godot

Après avoir vu les base de la programmation en C#, je vais apprendre à modifier la couleur d’un élément. Pour commencer simplement avec Godot et C#, je vais modifier la couleur d’un simple cube.

D’abord je vais rappeler comment faire un cube qui n’est pas soumis par les lois de la physique.

Ce noeud est StaticBody3D.

StaticBody3D à besoin d’un noeud CollisionShape3D et d’un MeshInstance3D.

Pour rappel CollisionShape3D permet, comme son nom l’indique, de définir la hitbox d’un élément. MeshInstance3D permet de définir une forme simple comme un cylindre, un cube, une surface plane, etc.

L’arborescence ressemble à ceci:

  • StaticBody3D
    • MeshInstance3D
    • CollisionShape3D

Pour modifier la couleur de nôtre cube depuis l’inspecteur Godot, nous pouvons sélectionner MeshInstance3D puis Surface Material Override. Comme son nom l’indique, nous allons changer les propriétés de la surface de l’objet. Par exemple, il est possible de modifier sa couleur, de faire un dégrader, de le rendre rugueux comme du bois ou métallique, d’ajouter de l’ombre, etc.

Il faut créer un nouveau StandardMaterial3D, sélectionner Albedo et choisir la couleur voulu.

StandardMaterial3D
Albedo Color

Voilà comment faire avec l’inspecteur Godot.

 

Maintenant voyons comment faire la même chose à l’aide du script C#.

2. Modifier la couleur avec C#

using Godot;
using System;

public partial class cube : StaticBody3D
{
    // Called when the node enters the scene tree for the first time.
    public override void _Ready()
    {
   	 StandardMaterial3D mat = new StandardMaterial3D();
   	 Color col = new Color(0f, 1f, 0f);
   	 mat.AlbedoColor = col;
   	 GetNode<MeshInstance3D>("MeshInstance3D").SetSurfaceOverrideMaterial(0, mat);
    }

    // Called every frame. 'delta' is the elapsed time since the previous frame.
    public override void _Process(double delta)
    {
    }
}

Nous devons créer une variable de type StandardMaterial3D. Je l’ai appelé “mat” pour matériau.
En C#, quand on souhaite créer une nouvelle variable, il faut toujours l’instancier.

Je vais instancier mat avec le mot-clé new. Ici, new, permet d’allouer de la mémoire pour pouvoir utiliser notre variable.

new StandardMaterial3D() créer un objet de type StandardMaterial3D et mat en devient alors la référence.

StandardMaterial3D mat  -> Réserve de la mémoire

new StandardMaterial3D(); -> Alloue la mémoire

Il faut bien comprendre que si nous instancions pas la variable mat avec le mot clé new StandardMaterial3D, mat pointera sur rien. Nous pourrions l’appeler mais pas utiliser les propriétés de StandardMaterial3D.

Je vais faire la même chose pour créer une variable qui stockera des données de couleurs.

Color col = new Color(R,G,B);

Ici la variable col est de type Color. Nous l’avons bien instancier avec le mot clé new Color(). Vous l’avez remarqué, Color prend des arguments en paramètre. J’ai mis 3 paramètre: 

  • R : Red
  • G : Green
  • B : Blue

En réalité, il y a un quatrième paramètre qui est l’alpha color. Pour faire simple, c’est l’opacité de la couleur. Par défaut, elle sera toujours à 1.0f ce qui est le niveau maximum. Cela veut dire que la couleur ne sera pas transparente.

Pour choisir une couleur, la valeur R,G ou B doit être comprise entre 0f et 1f. Si toute les valeurs sont à 0f, la couleur obtenue sera le noir et si les variables sont à 1f, nous obtenons du blanc.

Il est donc tout à fait possible de créer des couleurs personnalisées.

Voici une petite liste de couleurs : 

Vous pouvez retrouver une plus grande liste de couleur sur la documentation officiel de Godot : https://docs.godotengine.org/en/stable/classes/class_color.html

Maintenant nous allons attribuer la couleur (col) avec notre matériau créé précédemment (mat). N’oubliez pas que mat est un StandardMaterial3D. Nous pouvons donc utiliser les méthodes de StandardMaterial3D. 

Pour sélectionner une couleur nous faisons :

mat.AlbedoColor = col;

Remarqué que .AlbedoColor porte le même nom que les noms des catégories dans l’inspecteur vu précédemment.

 

Maintenant, pour appliquer la couleur nous avons un problème. Le script est appliqué au nœud parent StaticBody3D. Pour rappel, le noeud qui nous intéresse est MeshInstance3D. Pour sélectionner le noeud qui nous intéresse, nous pouvons faire : 

GetNode<noeud>("nom du noeud");

Imaginons que je renomme le noeud MeshInstance3D en Pikachu. Pikachu restera un noeud MeshInstance3D. Juste son nom change.

Donc pour accéder au nom qui nous intéresse, ici MeshInstance3D :

GetNode<MeshInstance3D>(“Pikachu”);

Pour appliquer le matériau que nous avons créé, nous allons utiliser la méthode SetSurfaceOverrideMaterial();

Donc :

GetNode<MeshInstance3D>(“Pikachu”).SetSurfaceOverrideMateriel(0, mat);

SetSurfaceOverrideMateriel() prend 2 arguments. Le premier est l’indice du matériau et le second est la variable de type SurfaceMaterial3D. Par défaut, l’indice est 0 car c’est nôtre seul matériau comme sur l’image ci-dessous.

indice mat surfacematerial3D

 

Il nous reste plus qu’à sauvegarder et lancer le programme.

 

Voilà on a réussi à appliquer une couleur en C#.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut