Unity namespace

Unity – Espaces de noms (namespace)

Sur Unity, l’espace de noms (namespace) résout les conflits de noms de fichiers et fournit implicitement une meilleure organisation du code.
Les espaces de noms sont courants dans de nombreux langages et sont simples à utiliser.

Table des matières

Ajouter notre premier espace de noms Unity

Pour ajouter un espace de noms dans Unity, vous devez d’abord créer un fichier C#.

Les espaces de noms peuvent englober tous les types de membres (classes, structures, énumérations, interfaces, etc.).
Dans la plupart des cas, ils sont déclarés après vos déclarations « using » et englobent via l’utilisation d’accolades :

    using UnityEngine;

    namespace App
    {
        public class PlayerController : MonoBehaviour
        {
            // Implémentation de la classe
        }
    }
    

Votre espace de noms est comme une hiérarchie, et vous pouvez également définir un sous-niveau.
Il est courant dans Unity de définir un espace de noms par dossier :

    using UnityEngine;

    // L'emplacement de ce fichier est : Scripts/UI
    namespace App.UI
    {
        public class HealthBar : MonoBehaviour
        {
            // Implémentation de la classe
        }
    }
    

Si vous êtes familier avec C#, vous savez peut-être qu’à partir de C# 10, vous pouvez définir un espace de noms sans accolades, comme ceci : namespace App;
Malheureusement, au moment de la rédaction (décembre 2023), Unity ne prend en charge que le C# 9.

Référencer notre espace de noms

Maintenant que notre espace de noms englobe notre classe, pour référencer cette classe, vous devez l’importer.
En C#, l’importation se fait avec la directive « using » :

    using App;

    public class Manager
    {
        private PlayerController _playerController;
    }
    

Il est également possible de référencer directement en préfixant notre membre avec son espace de noms entièrement qualifié :

    public class Manager
    {
        private App.PlayerController _playerController;
    }
    

Cependant, si vous souhaitez référencer un membre dans le même espace de noms, l’importation est inutile ; un appel direct suffit.

    using UnityEngine;

    namespace App
    {
        public class WeaponManager : MonoBehaviour
        {
            public void Init(PlayerController playerController)
            {
                // Faire quelque chose
            }
        }
    }
    

Si vous êtes dans un sous-espace de noms, l’importation est également inutile.

    using UnityEngine;

    namespace App.Collision
    {
        public class Rock : MonoBehaviour
        {
            private void OnTriggerEnter(Collider other)
            {
                if (other.CompareTag("Player"))
                {
                    var player = other.gameObject.GetComponent<PlayerController>();
                }
            }
        }
    }
    

Mais pour référencer un membre présent dans un sous-espace de noms, même si vous êtes dans ou avez importé l’espace de noms parent, cela ne fonctionnera pas sans importer le sous-espace de noms.

Exemple qui ne fonctionne pas :

    namespace App
    {
        public class Manager
        {
            // Essayer de référencer App.Collision.Rock
            public Rock rock;
        }
    }

    using App;

    public class GameBootstrap
    {
        // Essayer de référencer App.Collision.Rock
        public Rock rock;
    }
    

Nous corrigeons cela avec la directive « using » :

    using App.Collision;

    namespace App
    {
        public class Manager
        {
            // Essayer de référencer App.Collision.Rock
            public Rock rock;
        }
    }

    using App.Collision;

    public class GameBootstrap
    {
        // Essayer de référencer App.Collision.Rock
        public Rock rock;
    }
    

Résoudre les conflits de noms

La première solution pour résoudre un conflit de noms, par exemple avec 2 classes, est d’importer l’un des deux espaces de noms pour l’un et d’utiliser une référence complète avec l’espace de noms pour le second.

Par exemple, dans Unity, l’espace de noms UnityEngine a la classe Random, et System a également une classe du même nom.

    using UnityEngine;

    namespace App
    {
        [System.Serializable]
        public class Manager : MonoBehaviour
        {
            private void Start()
            {
                var value = Random.value;
            }
        }
    }
    

La deuxième solution, qui est pour moi la meilleure, est de définir un alias pour notre classe, nous permettant de garder les deux imports et de maintenir la lisibilité de notre code.

    using UnityEngine;
    using System;
    using Random = UnityEngine.Random;

    namespace App
    {
        [Serializable]
        public class Manager : MonoBehaviour
        {
            private void Start()
            {
                var value = Random.value;
            }
        }
    }
    

Ajouter un espace de noms racine dans le modèle

Depuis Unity 2020.2, vous avez la possibilité d’ajouter un espace de noms racine, et cet espace de noms sera automatiquement ajouté lors de la création d’un fichier.

  1. Dans le menu supérieur, cliquez sur « Editor » -> « Project Settings« .
  2. Allez à l’onglet Editor.
  3. Faites défiler vers le bas et modifiez le champ « Root namespace« .

Espace de noms racine Unity

Si vous êtes sur Unity 2019 ou antérieur, pour ajouter un espace de noms à vos fichiers, vous devrez directement modifier les modèles de script.

  1. Ouvrez Unity Hub, dans Projets, regardez quelle version d’Unity utilise votre projet.Version de l'éditeur de projet Unity hub
  2. Ensuite, allez à l’onglet « Install« , copiez le chemin du dossier dans lequel l’éditeur utilisé par votre projet est situé.Chemin de l'éditeur Unity hub
  3. Ouvrez un explorateur de fichiers et utilisez votre copier pour accéder au dossier de l’éditeur.
  4. Ensuite, allez dans « Data\Resources\ScriptTemplates« ; ici, vous trouverez tous les modèles utilisés dans Unity.Chemin du modèle Unity
  5. Pour modifier l’espace de noms de MonoBehaviour, ouvrez ce fichier « 81-C# Script-NewBehaviourScript.cs.txt« .

Remarque : Avant d’apporter des modifications, je vous conseille de faire une sauvegarde de votre fichier. En cas d’erreur, il pourrait ne plus s’exécuter.

Nous pouvons ensuite modifier le fichier pour ajouter notre espace de noms comme ceci :

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

    namespace App
    {
        public class #SCRIPTNAME# : MonoBehaviour
        {
            // Start est appelé avant le premier frame
            void Start()
            {
                #NOTRIM#
            }

            // Update est appelé une fois par frame
            void Update()
            {
                #NOTRIM#
            }
        }
    }
    

Ajouter un espace de noms en fonction du chemin du fichier

Pour avoir une organisation de vos espaces de noms basée sur la hiérarchie de votre projet, nous devrons créer notre propre variable.
Nous utiliserons la méthode de Tomeetis :

Modifiez notre modèle en suivant les étapes de la section précédente :

Allez dans le dossier de votre éditeur Unity, naviguez jusqu’à « Data\Resources\ScriptTemplates« , puis modifiez le fichier « 81-C# Script-NewBehaviourScript.cs.txt« :

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

        namespace #NAMESPACE#
        {
            public class #SCRIPTNAME# : MonoBehaviour
            {
                // Start est appelé avant le premier frame
                void Start()
                {
                    #NOTRIM#
                }

                // Update est appelé une fois par frame
                void Update()
                {
                    #NOTRIM#
                }
            }
        }
        

Maintenant, ajoutez le script suivant ; il doit être placé dans un dossier « Editor« .

Définissez son espace de noms racine comme vu précédemment « Editor » -> « Project Settings » -> « Editor » -> « Root namespace« .

Maintenant, lorsque vous créez un MonoBehaviour, par exemple « Scripts/UI/Manager.cs » avec l’espace de noms racine « App« , il aura « App.UI » comme espace de noms.

Les points clés de l’utilisation des espaces de noms :

  • Éviter les conflits de noms
  • Améliorer la lisibilité
  • Faciliter la maintenance
  • Encourager la modularité

Merci de nous avoir lu.

Illustration de fond par Stefan Schweihofer
Illustration de la main par Gerd Altmann

Laisser un commentaire

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