---
title: シングルトンをどのように使用しますか？
slug: world-sdk-guide-ja/w_ig_cAmWNUBBFmJGOR_b
docTags: 
createdAt: 2024-09-02T08:34:13.136Z
---

シングルトンは、プログラム内に特定のクラスのインスタンスが1つだけ存在することを保証するデザインパターンです。

シングルトンパターンは、クラスの単一のグローバルインスタンスを提供し、ロジック、オーディオ、UI、世界内の集中リソースを管理するなど、必要な他のスクリプトから簡単にアクセスできるようにします。

ZEPETOScriptでは、次のようにシングルトンを実装できます：

```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"}
**👍 ヒント**

- シーンにシングルトンスクリプトが付いたGameObjectがすでにある場合、この形式を使用できます。
- ない場合は、GameObjectを作成するためのコードを追加します。
  - 例： `new GameObject("ObjectName").AddComponent<ClassName>();`
:::

UIを管理するためのシングルトンを実装してみましょう：

1\) シーンにUI > テキストとボタンを追加します。

- "IncreaseScore"ボタンが押されたときにスコアを増加させるロジックを設定します。
- "DecreaseScore"ボタンが押されたときにスコアを減少させるロジックを設定します。

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



2\) "ScoreManager"というスクリプトを作成し、シングルトンを適用します。

- ScoreManagerスクリプトは、スコアを増減させ、他のスクリプトから呼び出されたときにテキストを更新する責任があります。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text } from 'UnityEngine.UI';
 
export default class ScoreManager extends ZepetoScriptBehaviour {
 
    // シングルトンの宣言
    private static _instance: ScoreManager = null;
 
    public static get Instance(): ScoreManager {
        if (this._instance == null) {
            this._instance = GameObject.FindObjectOfType<ScoreManager>();
        }
 
        return this._instance;
    }
 
    // 変数の宣言
    public scoreText: Text;
    private _currentScore : number;
 
    Start() {   
        // テストのために初期スコアを0に設定
        this._currentScore = 0;
    }
 
    // 他のスクリプトがIncreaseScoreを呼び出すことができます
    public IncreaseScore(amount: number) {
        this._currentScore += amount;
        this.scoreText.text = `スコア : ${this._currentScore}`;
    }
 
    // 他のスクリプトがDecreaseScoreを呼び出すことができます
    public DecreaseScore(amount: number) {
        this._currentScore -= amount;
        this.scoreText.text = `スコア : ${this._currentScore}`;
    }
 
}

```



- スクリプトの説明
  - private static \_instance: これはクラス内のプライベート静的変数で、初期値はnullです。
  - public static get Instance: この静的プロパティは、外部コードがこのクラスのユニークなインスタンスにアクセスする方法を提供します。
  - チェック `if (this.\_instance == null)`.  もしnullであれば、GameObject.FindObjectOfType\<>()を使用してクラス名のコンポーネントを見つけて返し、それを静的変数に割り当てます。



3\) スクリプトを書いた後、インスペクターに戻り、テキストコンポーネントを接続します。

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



4\) 次に、「ScoreLogicSample」というスクリプトを作成し、シングルトンを呼び出す方法を示します。ScoreManagerとScoreLogicSampleが同じディレクトリにあることを確認してください。

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

- このようにコードを書きます:

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject } from 'UnityEngine';
import { Text, Button } from 'UnityEngine.UI';
// シングルトンスクリプトをインポート
import ScoreManager from './ScoreManager';
 
export default class ScoreLogicSample extends ZepetoScriptBehaviour {
 
    public increaseScoreButton: Button;
    public decreaseScoreButton: Button;
 
    // ScoreManager型の変数を宣言
    private ScoreManager : ScoreManager;
 
    Start() {   
 
        // ScoreManagerを変数に割り当て
        this.ScoreManager = GameObject.FindObjectOfType<ScoreManager>();
 
        this.increaseScoreButton.onClick.AddListener(()=> {
            // シングルトンで宣言された関数を呼び出す
            this.ScoreManager.IncreaseScore(10);
        });
 
        this.decreaseScoreButton.onClick.AddListener(()=> {
            // シングルトンで宣言された関数を呼び出す
            this.ScoreManager.DecreaseScore(10);
        });
    }
}
```



- シングルトンスクリプトを取得する際には、パスを正しく指定することが重要です。
- 必要に応じて、自分のスクリプト内でScoreManagerが呼び出される部分を調整できます。



5\) \[▶︎(再生)]ボタンを押してテストします。

- ScoreLogicSampleのボタンをクリックすると、ScoreManager内の関数が呼び出され、期待通りに動作するのを観察する必要があります。

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

