使用環境
・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スクリプトを書こう!