Unity入門

【Unity入門】変数のスコープと共有の基本|public・private・static・SerializeField・シングルトン

使用環境

・Unity Editor:2021.3.18f1

この記事でわかること

  • ローカル・メンバー・グローバル変数の違い
  • public / private / static の意味と使い方
  • SerializeFieldを使った安全な変数公開
  • スクリプト間で変数を共有する方法(public / static / シングルトン)

Unityで変数を正しく使うには?

ピッグダディ

変数のスコープを理解して使い分けることが、バグの少ないUnity開発の第一歩だよ。
local、public、staticそれぞれ役割が違うんだ。

ピッグボーイ

publicで他のスクリプトからアクセスできるのは分かるけど、SerializeFieldってなんなんですか?

ピッグガール

シングルトンって名前は聞いたことあるけど、
使いどころがよく分からなくて…

ピッグダディ

安心して!
この記事では、変数のスコープ、変数の共有方法、SerializeFieldの活用、シングルトンの実装まで、初学者でも分かりやすく丁寧に解説していくよ!

変数のスコープとは?

変数のスコープとは「その変数がどこからアクセスできるか」という範囲のことです。
これを正しく使うことで、コードの見通しが良くなり、バグや意図しない動作を防ぐことができます。

※ この他にも以下のサイトを参考にしてください。

スコープの種類

種類適用範囲用途
ローカル変数メソッド内のみ一時的な処理や計算
メンバー変数クラス内(private・public)オブジェクトごとの状態管理
グローバル変数staticを付けた変数全スクリプト間の共有状態管理

public / private / SerializeField の違い

修飾子Inspectorに表示他スクリプトからアクセス
public
SerializeField private
private

SerializeFieldを使うメリット

UnityではSerializeFieldを使うと、private変数でもInspectorから変更可能になります。

SerializeFieldを使うとprivate変数でもInspectorで編集可能
外部スクリプトから直接変更できないため、安全性が向上

public class Player : MonoBehaviour
{
    [SerializeField] private int health = 100; // Inspector で表示される

    void Start()
    {
        Debug.Log("初期体力: " + health);
    }
}

スクリプト間で変数を共有する方法

public変数で共有

public class GameManager
{
    public int highScore = 0; // すべてのスクリプトからアクセス可能
}

public class Player : MonoBehaviour
{
    public GameManager gameManager; //Inspectorでアタッチが必要

    void Start()
    {
        gameManager.highScore = 100;
        Debug.Log("ハイスコア: " + gameManager.highScore);
    }
}

static変数のクラス間の受け渡し

public class GameManager
{
    public static int highScore = 0; // すべてのスクリプトからアクセス可能
}

public class Player : MonoBehaviour
{
    void Start()
    {
        GameManager.highScore = 100;

        Debug.Log("ハイスコア: " + GameManager.highScore);
    }
}

シングルトンとは?

シングルトンとは「ゲーム中に1つしか存在しないインスタンス」を作るパターンで、
ステージやスコア、設定の共有に向いています。

シングルトンの実装例

GameManager.Instanceでどこからでもアクセス可能
シーンが変わっても DontDestroyOnLoad()でデータを保持


※ static変数を使用していたとしてもアタッチしたオブジェクトがシーン間でDestroyされたら変数の値は消えます。(誤情報が多いので誤解しないように!)

public class GameManager : MonoBehaviour
{
  //static変数
    public static GameManager Instance { get; private set; }

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

シングルトンのメリットとデメリット

メリットデメリット
データの一元管理が可能依存関係が強くなりすぎると、テストが難しくなる
グローバル変数より安全にデータ共有ができる乱用すると、設計が複雑になる可能性がある
オブジェクトの重複を防ぐことで、メモリの無駄を減らせる

まとめ

ローカル変数 → メソッド内だけで使える、一時的なデータ保存に最適
メンバー変数(public、private) → オブジェクトごとのデータ管理に最適
グローバル変数(static) → すべてのスクリプトで共有可能、ただし制御が必要
SerializeFieldを使うと、Inspectorで編集できるがスクリプト外部からは変更不可
シングルトンを使えば、ゲーム全体のデータを安全に管理可能

変数を正しく使い分けて、見やすくバグの少ないUnityスクリプトを書こう!