top of page

Unityにおけるstatic変数の使い方と注意点

更新日:7月9日

static変数の使い方と注意点

Unityでゲームを制作していると、**「どこからでもアクセスできる共通の変数を作りたい」**という状況に遭遇します。そんなときに便利なのが、C#のstatic変数です。

この記事では、Unityでstatic変数を使う方法と、具体的な活用例、そして落とし穴について解説します。


🔹 static変数とは?


static変数とは、インスタンスに依存しない、クラスそのものに属する変数です。通常の変数はnewしたオブジェクトごとに個別のデータを持ちますが、static変数はアプリケーション中にたった1つだけ存在します。

public class GameManager
{
  public static int score = 0;
}

この場合、scoreはどこからでも以下のようにアクセスできます。

GameManager.score = 100;

🔸 Unityでの具体的な使い方


1. ゲーム全体のスコアや状態を保持

ゲームのスコアや現在のレベル、プレイヤーのHPなど、シーンをまたいで保持したい情報を扱う際に便利です。

public class GameData
{
  public static int score = 0;
  public static int playerHP = 100;
}

別スクリプトから:

void Update()
{
  GameData.score += 10;
  Debug.Log("現在のスコア: " + GameData.score);
}

2.フラグ管理や設定保持にも活用

例えば、デバッグ用のフラグや、タイトル画面で選んだ設定をゲーム中で参照するなどにも使えます。

public class GameSetting
{
  public static bool extraFlag = false;
}

どこからでもこのように利用可能:

if (GameSetting.extraFlag) 
{ 
  // 特別な処理 
}

3. シングルトンクラスとの併用

よくあるパターンとして、シングルトン + staticでアクセス可能な「常駐マネージャークラス」を作成します。

public class SoundManager : MonoBehaviour 
{ 
  public static SoundManager Instance; 
  
  void Awake() 
  { 
    if (Instance == null) 
    { 
      Instance = this; DontDestroyOnLoad(gameObject); 
    } 
    else 
    { 
      Destroy(gameObject); 
    } 
 } 
  
  public void PlaySE(AudioClip clip) 
  { 
    // 効果音再生処理 
  } 
}

使用例:

SoundManager.Instance.PlaySE(clip);

これはstatic変数でシーンをまたいで常に同じインスタンスにアクセスするための方法です。


⚠️ staticの注意点


1. Unityでは static はシリアライズされない

static変数はインスペクターに表示されず、エディタ上での変更や保存ができません。ゲーム開始時にscore = 0;とリセットされることに注意。

2. プレイモード終了後も値が残る

エディタでプレイモードを終了しても、static変数の値はそのまま残ることがあります。開発中に挙動がバグって見える原因になるので注意。

3. 複数人開発では設計に注意

staticは非常に便利ですが、どこからでもアクセスできるためにスパゲッティコードになりやすいです。乱用は避け、意図をもって使うことが大事です。


✅ まとめ

メリット

デメリット

どこからでもアクセスできる

保持状態が不明瞭になる可能性がある

シーンをまたいでもデータ保持

インスペクターから編集できない

インスタンス不要で軽量

テストしづらくなることがある

Unityでのstatic変数は、スコア管理、設定保持、グローバルフラグなどに非常に有効です。ただし、濫用せずに責任を持って設計することが重要です。

bottom of page