はじめに
Unityでゲーム開発をしていると、「どのシーンからでもアクセスしたい変数やクラス」が出てくることがあります。そんなとき便利なのが static(スタティック)というキーワードです。
🔍 Staticとは?
static は「静的なもの」、つまりインスタンス化せずに直接使えるという意味です。
通常、クラスの変数やメソッドを使うにはこうします:
Player player = new Player();
player.health = 100;
Unityでは,GameComponentごとにインスタンス化します.
でも static を使えば、こんなふうに 直接アクセス できます:
GameManager.score = 100;
⚙️ Staticを使うと何が起きるの?
- ✅ インスタンス不要
ゲームコンポーネント単位で設定する必要がない - ✅ どこからでもアクセス可能
シーンをまたいでもアクセスできる(メモリ上に残る) - ✅ 値が共有される
すべてのスクリプトで同じ値を参照・変更できる
🎯 具体的にStaticを使う場面
✅ ゲーム全体で共有するスコア・設定
public static class GameManager
{
public static int score = 0;
public static bool isSoundOn = true;
}
これならどのシーンのスクリプトからでも、
GameManager.score += 10;
と簡単に使えます。
✅ 共通定数(タグ名やレイヤー名など)
public static class Tags
{
public const string PLAYER = "Player";
public const string ENEMY = "Enemy";
}
ハードコーディングせずに、
if (collision.tag == Tags.PLAYER)
と書くことで、間違いも減ってメンテナンスも楽になります。
✅ ユーティリティクラス(汎用処理)
public static class Utils
{
public static float GetRandom(float min, float max)
{
return UnityEngine.Random.Range(min, max);
}
}
使うときは:
float speed = Utils.GetRandom(1f, 5f);
❗️Staticの注意点
破棄されない:シーンが変わっても残る。なので、明示的な初期化が必要。
依存しすぎ注意:何でも static にすると、テストしづらくなる・スパゲッティコード化の恐れも。
オブジェクトへの依存NG:GameObject や MonoBehaviour を static に持たせるのは避けよう(null や破棄の問題が起きやすい)。
✅ まとめ
よく使う用途 | static にすべき? |
---|---|
スコアや設定など全体共有 | ✅ Yes |
タグ名やレイヤー名など定数 | ✅ Yes |
一度だけ使う変数 | ❌ No |
MonoBehaviour(Transformなど) | ❌ 基本的に No |
static は便利な機能ですが、どこでも使える=どこからでも壊せるというリスクもあります。目的を明確にして、うまく使いこなしましょう!
✍️ おわりに
static は非常に便利で強力ですが、間違って使うとアプリ全体にバグを引き起こすこともあるため、慎重に扱う必要があります。
-
値を共有したいときに限定する
-
直接アクセスよりもプロパティ経由にする
-
MonoBehaviourとは切り離す
この3つを意識して、安全に static を活用していきましょう!