---
title: Comment utilisez-vous un Singleton ?
slug: world-sdk-guide-fr/comment-utilisez-vous-un-singleton
docTags: 
createdAt: 2024-09-02T08:34:13.136Z
---

Un Singleton est un modèle de conception qui garantit qu'il n'y a qu'une seule instance d'une classe particulière dans un programme.

Le modèle Singleton fournit une instance globale unique d'une classe, la rendant facilement accessible depuis d'autres scripts qui en ont besoin, comme la gestion de la logique, de l'audio, de l'interface utilisateur et des ressources centralisées dans le monde.

Dans ZEPETOScript, vous pouvez implémenter un Singleton de la manière suivante :

```typescript
private static _instance: ClassName = null;

public static get Instance(): ClassName {
	if (this._instance == null) {
		this._instance = GameObject.FindObjectOfType<ClassName>();
	}
	return this._instance;
}
```

:::hint{type="success"}
**👍 Conseils**

- S'il y a déjà un GameObject avec un script Singleton attaché dans la scène, vous pouvez utiliser ce format.
- S'il n'y en a pas, ajoutez du code pour créer le GameObject.
  - Exemple : `new GameObject("NomObjet").AddComponent<ClassName>();`
:::

Implémentons un Singleton pour gérer l'interface utilisateur dans un exemple :

1\) Ajoutez UI > Texte et Bouton à la scène.

- Configurez la logique pour augmenter le score lorsque le bouton "AugmenterScore" est pressé
- Configurez la logique pour diminuer le score lorsque le bouton "DiminuerScore" est pressé

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-WA4wOFac329w01mfJQcc3-20240904-102422.png)



2\) Créez un script appelé "ScoreManager," où le Singleton sera appliqué.

- Le script ScoreManager sera responsable de l'augmentation/diminution du score et de la mise à jour du texte lorsqu'il est appelé depuis d'autres scripts.

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text } from 'UnityEngine.UI';
 
export default class ScoreManager extends ZepetoScriptBehaviour {
 
    // Déclaration du Singleton
    private static _instance: ScoreManager = null;
 
    public static get Instance(): ScoreManager {
        if (this._instance == null) {
            this._instance = GameObject.FindObjectOfType<ScoreManager>();
        }
 
        return this._instance;
    }
 
    // Déclaration des variables
    public scoreText: Text;
    private _currentScore : number;
 
    Start() {   
        // Définir le score initial à 0 pour les tests
        this._currentScore = 0;
    }
 
    // D'autres scripts peuvent appeler IncreaseScore
    public IncreaseScore(amount: number) {
        this._currentScore += amount;
        this.scoreText.text = `Score : ${this._currentScore}`;
    }
 
    // D'autres scripts peuvent appeler DecreaseScore
    public DecreaseScore(amount: number) {
        this._currentScore -= amount;
        this.scoreText.text = `Score : ${this._currentScore}`;
    }
 
}

```



- Description du script
  - private static \_instance: C'est une variable statique privée au sein de la classe, initialement définie sur null.
  - public static get Instance: Cette propriété statique fournit un moyen pour le code externe d'accéder à l'instance unique de cette classe.
  - Vérifiez `if (this.\_instance == null)`. Si c'est null, utilisez GameObject.FindObjectOfType\<>() pour trouver et retourner un composant de type ClassName, et l'assigner à la variable statique.



3\) Après avoir écrit le script, retournez à l'Inspecteur et connectez le composant Texte.

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-ORrY57RIDdF3i0v1Rh0F9-20240904-102422.png" size="76" width="300" height="264" position="center" showCaption="false"}



4\) Ensuite, créez un script appelé "ScoreLogicSample" pour démontrer comment appeler le Singleton. Assurez-vous que ScoreManager et ScoreLogicSample sont dans le même répertoire.

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-J04ZZYJgBRuWFp5mI6tJ2-20240904-102422.png" size="62" width="247" height="146" position="center" showCaption="false"}

- Écrivez du code comme ceci :

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text, Button } from 'UnityEngine.UI';
// Importer le script Singleton
import ScoreManager from './ScoreManager';
 
export default class ScoreLogicSample extends ZepetoScriptBehaviour {
 
    public increaseScoreButton: Button;
    public decreaseScoreButton: Button;
 
    // Déclarer une variable de type ScoreManager
    private ScoreManager : ScoreManager;
 
    Start() {   
 
        // Assigner ScoreManager à la variable
        this.ScoreManager = GameObject.FindObjectOfType<ScoreManager>();
 
        this.increaseScoreButton.onClick.AddListener(()=> {
            // Appeler la fonction déclarée dans le Singleton
            this.ScoreManager.IncreaseScore(10);
        });
 
        this.decreaseScoreButton.onClick.AddListener(()=> {
            // Appeler la fonction déclarée dans le Singleton
            this.ScoreManager.DecreaseScore(10);
        });
    }
}
```



- Il est important de spécifier le chemin correctement lors de l'obtention du script Singleton.
- Vous pouvez adapter la partie où ScoreManager est appelé dans votre propre script selon vos besoins.



5\) Appuyez sur le bouton \[▶︎(lecture)] pour tester.

- Vous devriez observer les fonctions dans ScoreManager être appelées lorsque vous cliquez sur les boutons dans ScoreLogicSample, ce qui les fait fonctionner comme prévu.

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-nLqzRvwNUFM7TJ48BWbYl-20240904-102422.gif)

