Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
We use cookies to ensure that we provide you with the best possible experience on our site.
Votre source incontournable sur Unity et le développement web
Votre source incontournable sur Unity et le développement web
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
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.
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;
}
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;
}
}
}
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.
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.
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#
}
}
}
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.
Merci de nous avoir lu.
Illustration de fond par Stefan Schweihofer
Illustration de la main par Gerd Altmann