Unity tutorial n°3 – Manipuler les GameObjects par code

Journal de bord d'Eviral, développeur du jeu vidéo amateur The Bloodian Chronicles, un fan game qui rend hommage à l'arche du Captain Blood, un jeu vidéo de science fiction sorti en 1988 sur Atari ST, Amiga, Amstrad, Commodore...

Unity tutorial n°3 – Manipuler les GameObjects par code

Pour illustrer ce tutorial, je vous propose de reprendre le projet commencé lors du tutorial précédent. Vous pouvez télécharger le projet Unity complet ici.

Nous avons vu précédemment ce qu’était un GameObject dans Unity, nous avons même créé notre premier GameObject (c’était la planète terre en 3D).

Dans l’éditeur (l’interface graphique de Unity), on peut masquer un GameObject existant en décochant la checkbox qui se trouve juste devant le nom du GameObject.
Le GameObject ne sera alors pas rendu à l’écran.

Création d’un premier script C#

Nous allons créer notre premier script C# qui va nous permettre de masquer la terre en appuyant par exemple sur la barre espace.

A la racine d’Assets, créez un nouveau sous dossier que vous allez nommer “Scripts”.

Double cliquez sur le dossier Scripts pour rentrer dedans et créez un nouveau script C# que vous allez nommer “EarthManager.cs”.

Unity ne possède pas d’éditeur de code intégré, on est libre de choisir son éditeur préféré (Visual Studio, Visual Studio Code, Notepad++…).
Je vous recommande Visual Studio Code car la coloration syntaxique, l’intellisense (auto complétion), la précompilation et même le débogage sont supportés.
Pour le débogage il faudra installer cette extension vscode fournie par Unity :
https://marketplace.visualstudio.com/items?itemName=Unity.unity-debug

Vous pouvez changer l’éditeur de code par défaut en allant dans le menu Edit / Preferences / External Tools.

Structure d’un script C#

Double cliquez sur le script et il s’ouvre dans l’éditeur par défaut défini dans Unity (Visual Studio Code dans mon cas).

Tous les scripts C# Unity héritent par défaut de la classe MonoBehavior.
Grace à cette classe de base, vous allez pouvoir glisser/déposer vos scripts sur un GameObject pour attacher votre script dessus.

using UnityEngine;

public class EarthManager : MonoBehaviour
{
    // Start is called before the first frame update
    private void Start()
    {
        
    }

    // Update is called once per frame
    private void Update()
    {
        
    }
}

Deux méthodes sont déjà présentes dans ce squelette de script :

  • Start() : Le code déclaré dans cette méthode ne sera exécuté qu’une seule fois au démarrage
  • Update() : Le code déclaré dans cette méthode sera exécuté en boucle, soit environ 30 fois par seconde pour faire simple.

Attacher un script C# à un GameObject

Les scripts peuvent être rattachés à un GameObject. Grace à cela, on peut ajouter en quelque sorte des comportements (behaviors) à un GameObject. Pour ajouter un premier comportement à notre planète terre, on va glisser/déposer notre script “EarthManager” vers le GameObject “Earth”.

Maintenant que le script est rattaché au GameObject, on va coder le comportement souhaité.

using UnityEngine;

public class EarthManager : MonoBehaviour
{
    // Start n'est appelé qu'une seule fois
    private void Start()
    {
        
    }

    // Update est appelé à chaque changement de frame
    // cad 30 fois par secondes si le jeu est joué à 30 frames par secondes
    private void Update()
    {
        // si la touche espace est enfoncée
        if (Input.GetKeyDown("space"))
        {
            // on écrit une trace dans la console
            Debug.Log("la touche espace a été enfoncée");
            
            // this représente l'instance du script
            // this.gameObject donne accès au GameObject du script
            // activeSelf donne la visibilité du GameObject
            bool isActive = this.gameObject.activeSelf;
            if (isActive)
            {
                // si le GameObject est actif (est visible)
                Debug.Log("on cache le gameobject 'earth'");

                // on désactive la visibilité du gameObject (on le cache)
                this.gameObject.SetActive(false);
            }
        }
    }
}

Pour tester notre code, on va lancer notre jeu dans l’éditeur :

Si vous appuyez sur la touche espace, vous constatez que la terre disparaît (elle n’est plus affichée par le moteur de rendu car la visibilité de son GameObject est désactivée).

Restez en mode play (onglet Game actif), sélectionnez le GameObject Earth dans la hiérarchie à gauche si ce n’est pas déjà fait et regardez l’état de la checkbox de visibilité du GameObject dans l’inspector à droite.

L’interface reflète les modifications apportées par l’exécution du code quand on est en mode Play. Cela offre un premier niveau de débogage visuel au niveau de l’éditeur.

Quand on désative un GameObject, tous les scripts qui lui sont rattachés s’arrêtent.

Les Debug.Log écrivent une trace dans la console de l’éditeur. Les traces sont un début de débogage, elles permettent de savoir quelques lignes de code ont été exécutées et même d’afficher la valeur des variables.

La console de l’éditeur affiche les traces laissées par Debug.Log

Création d’un second script C#

On va ajouter un second comportement à notre planète (qui va s’ajouter à celui qui existe déjà). En plus de masquer la terre quand on appuie sur la barre espace, on va la faire tourner sur elle même.

Créez un nouveau script dans Assets/Scripts et nommer le “EarthRotation.cs”.
Copier/coller le code ci-dessous dans votre script.

using UnityEngine;

public class EarthRotation : MonoBehaviour
{
    public Vector3 localRotationSpeed;

    // Start is called before the first frame update
    private void Start()
    {
        
    }

    // Update is called once per frame
    private void Update()
    {
        this.transform.Rotate(localRotationSpeed * Time.deltaTime, Space.Self);
    }
}

Faites un glisser/déposer du script “EarthRotation” sur le GameObject “Earth”.
Le script est rattaché au GameObject, juste en dessous du précédent (EarthManager).
Le script expose une variable publique nommée “LocalRotationSpeed ” qui permet de personnaliser la vitesse et l’axe de rotation.
Mettez 50 au niveau de l’axe Y.

Cette variable est de type Vector3, c’est à dire un vecteur à 3 dimensions qui permet de stoker une valeur pour les X, une valeur pour les Y et une valeur pour lez Z.
Les vecteurs sont très utiles, nous y reviendrons plus tard.

Lancez l’exécution de votre jeu (bouton Play), la planète terre tourne sur elle même à une vitesse de 50 sur l’axe des Y. Si vous appuyez sur espace, elle continue à disparaître.

Dans l’éditeur, vous voyez en live que votre script change la rotation du GameObject sur l’axe Y.

Conclusion

Grace à 2 petits scripts en C#, nous avons pu ajouter 2 comportements différents à notre GameObject “Earth”. Ces scripts sont réutilisables à l’infini, vous pouvez les utiliser sur d’autres GameObjects (vous allez ainsi créer plusieurs instances d’un même script).

Plus vous allez avancer dans l’apprentissage de Unity et plus vous allez pouvoir vous faire une bibliothèque de scripts que vous pourrez réutiliser suivant vos besoins.

Vous pouvez télécharger le projet Unity complet ici.

Tags:

Laisser un commentaire

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