当サイトを閲覧いただきありがとうございます。
本記事では、Game Creator 2のコア機能のひとつである「Variables」(変数)について詳しく解説します。
Variablesはゲームの進行状況や動的な値を格納するためのデータコンテナです。スコア/ライフ/装備中の武器参照/シーン上の敵リストなど、ゲーム内で変化するあらゆる値に使います。
公式ドキュメント:Game Creator 2 Documentation
Variablesとは
- 値を動的に変更できるデータコンテナ
- 名前(Name)または添字(Index)で識別する
- **ローカル(シーン内)/グローバル(シーン間)**で持ち方を選択できる
- セーブ・ロード対象にもなる(プリミティブ型のみ)
例:プレイヤーのスコアを保持する score というName Variableを用意。初期値0。星を取るたびに加算、UIに反映、といった使い方です。
2種類の変数 ― NameとList
Name Variables(名前付き)
- 一意の名前で識別する
- 例:
score = 47、equippedWeapon = (GameObject) - ほとんどのケースで推奨される形式
List Variables(リスト)
- 0始まりの数値インデックスでアクセスする配列
- すべての要素は同じ型で保持される
- 例:
- Index 0: Enemy #3
- Index 1: Enemy #7
- Index 2: Enemy #1
- Index 3: Enemy #4
どちらを使うか
原則Name Variablesを推奨します。Listは「対象が不定個数ある」場合に使います。例えばプレイヤー周囲の敵群からロックオン対象を選ぶ、といったケースです。
2つのスコープ ― LocalとGlobal
Local Variables
- 特定のシーン内にのみ存在。そのシーンを離れると無効
- シーン上のGameObjectにコンポーネントとして付く
- Name Variables/List Variablesの両方がある
Global Variables
- プロジェクト全体で共有。どのシーンからでも参照/変更可能
- ScriptableObjectアセットとして作成。ランタイム値は内部のシングルトンマネージャが保持
- Name Variables/List Variablesの両方がある
IDの衝突
どちらのスコープでも、同じIDの変数が2つあると互いに値を上書きしあいます。衝突メッセージが出たら、IDフィールドを展開 → Regenerate で新しい一意なIDを生成してください。
Value Types(値の型)
初期値を設定する際に選べるデフォルトの型一覧です(モジュール追加で増えることもあります)。
| 型 | 用途 | セーブ対応 |
|---|---|---|
| Number | 数値。整数・小数の両対応 | ○ |
| String | テキスト | ○ |
| Boolean | true / false | ○ |
| Vector 3 | (x, y, z) ベクタ | ○ |
| Color | RGBA(HDR含む) | ○ |
| Texture | Textureアセット参照 | ✕ |
| Sprite | Spriteアセット参照 | ✕ |
| Material | Materialアセット参照(v2.13.43以降) | ✕ |
| Animation Clip | AnimationClipアセット参照(v2.13.43以降) | ✕ |
| Game Object | シーン上のGameObject参照 | ✕ |
重要:Texture/Sprite/Material/Animation Clip/GameObjectはシリアライズ不可なのでセーブ対象になりません。プレイセッションをまたいで残したい値にはこれら以外を使ってください。
Nested Access(入れ子参照)
「変数が指し示すオブジェクトが持つ変数」へ1つのキーで辿れる仕組みです。
例:PlayerのLocal Name Variablesに target : GameObject を置きます。ターゲットは動的に変わりますが、どの敵にも health : Number というLocal Name Variablesがあります。
→ target/health とスラッシュで繋ぐキーを書くだけで、現在のターゲットのHPを参照できます。
これにより、参照チェーンをハードコーディングせず、ノード1個で「動的なオブジェクトの動的な値」に到達できます。
アセット/コンポーネントの作成
Global Name Variables
- Project右クリック →
Create > Game Creator > Variables > Name Variables - 生成されたアセットのインスペクタで、入力欄に変数名を打ちEnter(または
[+]ボタン) - 名前・型・Value(初期値)が編集可能
Global List Variables
- Project右クリック →
Create > Game Creator > Variables > List Variables - 要素の型を選び、配列要素を追加
Local Name Variables
- Hierarchy右クリック →
Game Creator > Variables > Name Variables→ 新規GameObjectにLocal Name Variablesコンポーネントが付く - あるいは任意のGameObjectに
Local Name Variablesコンポーネントを追加
Local List Variables
- Hierarchy右クリック →
Create > Game Creator > Variables > List Variables - あるいは任意のGameObjectに
Local List Variablesコンポーネントを追加
共通:エントリー追加
作成欄に名前を入力 → Enterまたは [+]。名前・値の型・初期値は後からでも変更できます。
Save & Loadとの関係
- 各変数エントリーにはSaveオプションが付いており、セーブ対象に含めるか選べます
- SaveをOFFにすると:セーブしても値は書き込まれず、ロード時も初期値のままになります。「ロード後も必ず初期値でスタートしたい設定値」などに有効です
- Texture/Sprite/GameObject型の変数はそもそも保存不可(SaveをONにしても無視)
Properties(変数にアクセスする共通抽象)
GC2の多くのInstruction/Condition/Eventでは、フィールドの値を動的に決めるドロップダウンを持ちます。その仕組みがPropertyです。
Propertyとは
- ポリモーフィックシリアライズを使って「定数」「変数」「プレイヤー位置」「自分の子の位置」…といった選択肢をノードフィールドに動的に差し込める
- 型別に
PropertyGet<Type>(取得)/PropertySet<Type>(設定)というクラスが用意されている - 引数として**
Args**構造体を受け取り、Self(この呼び出しを発したGameObject)とTarget(対象のGameObject)を使ってコンテキスト依存の値も返せる
主なPropertyクラス
PropertyGetNumber/PropertySetNumberPropertyGetString/PropertySetStringPropertyGetBool/PropertySetBoolPropertyGetGameObject/PropertySetGameObjectPropertyGetPosition/PropertyGetDirectionPropertyGetColor、PropertyGetTexture、PropertyGetSpriteなど
UI Toolkit必須:Propertyを使った独自EditorスクリプトはUnityのUI Toolkitで書く必要があります。IMGUIは非対応です。
Propertyの使い方(C#)
public PropertyGetString myValue = new PropertyGetString();
void Start()
{
Args args = new Args(this.gameObject);
string value = this.myValue.Get(args);
Debug.Log(value);
}
カスタムPropertyを作る
// 常に 42 を返す Number プロパティ
public class GetNumber42 : PropertyTypeGetNumber
{
public override double Get(Args args)
{
return 42;
}
// Inspector に表示する短いタイトル
public override string String => "42";
}
Title / Category / Description / Keywords / Image / Version / Dependency 属性で装飾可能です(Instruction/Eventと同様)。[SerializeField] でフィールドも追加でき、さらに内部に別Propertyを持たせることもできます。
Variables API(スクリプトからの読み書き)
Local Name Variables
コンポーネント参照を取得して直接呼びます。
using GameCreator.Runtime.Variables;
LocalNameVariables vars = GetComponent<LocalNameVariables>();
// 取得
bool ok = vars.Exists("score");
object value = vars.Get("score"); // 実際の型にキャストして使う
int score = (int)value;
// 設定
vars.Set("score", 100);
// 変更通知
System.Action<string> cb = (name) => Debug.Log($"Changed: {name}");
vars.Register(cb);
vars.Unregister(cb);
Local List Variables
LocalListVariables list = GetComponent<LocalListVariables>();
int count = list.Count;
// 末尾追加
list.Push(someGameObject);
// クリア
list.Clear();
// 要素移動
list.Move(pickFrom, pickTo);
// 変更通知
System.Action<ListVariableRuntime.Change, int> cb = (change, index) =>
Debug.Log($"{change} at {index}");
list.Register(cb);
list.Unregister(cb);
Global Name Variables
シングルトンマネージャ経由で操作します。
using GameCreator.Runtime.Variables;
GlobalNameVariables asset = ...; // アセット参照
var mgr = GlobalNameVariablesManager.Instance;
bool ok = mgr.Exists(asset, "score");
object value = mgr.Get(asset, "score");
mgr.Set(asset, "score", 100);
mgr.Register(asset, (name) => Debug.Log(name));
mgr.Unregister(asset, cb);
Global List Variables
var mgr = GlobalListVariablesManager.Instance;
int count = mgr.Count(asset);
mgr.Push(asset, value);
mgr.Set(asset, pick, newValue);
mgr.Insert(asset, pick, content);
mgr.Remove(asset, pick);
mgr.Clear(asset);
mgr.Move(asset, pickA, pickB);
mgr.Register(asset, (change, index) => { ... });
mgr.Unregister(asset, cb);
共通:Pickクラス
IListGetPick / IListSetPick は「どのインデックスを指すか」を抽象化するインターフェースです。特定のインデックス・最初・最後・ランダムなどの具象実装があります。
Visual Scriptingリファレンス(Instruction/Condition/Event全一覧)
Instructions(16)
カテゴリは Variables > ... です。
| 命令 | 機能 | 主なパラメータ |
|---|---|---|
| Change ID | Local Name/List変数のIDを変更(Savableでない変数のみ) | Name(新ID) |
| Clear List | Listの全要素を削除 | List Variable |
| Collect Characters | 指定位置から Min〜Max Radius の距離にあるCharacterをリストに収集。Filter(Conditions)で絞込可能 | Origin/Max Radius/Min Radius/Store In/Filter |
| Collect Markers | 同上、対象がMarker | Origin/Max Radius/Min Radius/Store In/Filter |
| Filter List | Listの各要素をConditions評価し、falseのものを削除 | List Variable/Filter |
| Iterator Next | 反復用インデックスを+1(Mode でLoop / Clamp) | Index/List Variables/Mode |
| Iterator Previous | 反復用インデックスを-1(Mode でLoop / Clamp at 0) | Index/List Variables/Mode |
| Iterator Random | 0〜要素数のランダム値をIndexに格納 | Index/List Variables |
| Loop List | Game Object Listを反復し、各要素にActionsを実行(各回 Target に要素をセット) | List Variable/Actions |
| Move List | List内のある要素を別位置へ移動 | List Variable |
| Remove From List | 指定要素を削除 | List Variable |
| Reverse List | 並び順を反転 | List Variable |
| Shuffle List | 並び順をランダム化 | List Variable |
| Sort List Alphabetically | 文字列でソート(昇/降、Ignore Case指定可) | List Variable/Order/Ignore Case |
| Sort List By Distance | 指定位置からの距離でソート(近い順/遠い順) | List Variable/Position/Order |
| Swap List | Listの2要素を入替 | List Variable |
変数の値そのものを直接読み書きする命令(Set Number など)は Math > Arithmetic や Math > Boolean 等のカテゴリに分かれて存在します。詳細はVisual Scriptingの記事を参照してください。
Conditions(1)
| 条件 | 判定内容 | 主なパラメータ |
|---|---|---|
| List Is Empty | 指定List Variableが空ならtrue | List Variables |
「変数の値が等しいか」を判定するには Math > Arithmetic > Compare Decimal / Compare Integer、Math > Boolean > Compare Boolean、Text > Text Equals など値の型に応じたCompare系Conditionを使います。
Events(4)
Trigger コンポーネントから変数の変化を購読します。
| イベント | 発火タイミング |
|---|---|
| On Global Name Variable Change | Global Name変数が変更された瞬間 |
| On Global List Variable Change | Global List変数が変更された瞬間 |
| On Local Name Variable Change | Local Name変数が変更された瞬間 |
| On Local List Variable Change | Local List変数が変更された瞬間 |
これらのイベントで「スコアが増えたらUIを更新」「ターゲットが変わったらアイコンを差し替え」といった処理を疎結合に書けます。
実践的な使い方 ― やりたいこと別の構成ガイド
スコア管理
- Global Name Variablesアセットを作り、
score : Number = 0を追加 - アイテム取得時のTriggerのInstructionで
Increment Number→scoreを+10 - UI Text側ではTriggerのEventを
On Global Name Variable Changeにして、Change Textで再描画
敵ロックオン候補をリスト化
- Local List VariablesをPlayerに付け、
targets : GameObjectタイプで作成 Collect CharactersInstructionでPlayer周囲10m内のCharacterをtargetsに収集、FilterでTag == "Enemy"Sort List By DistanceでPlayerからの距離順に整列Iterator Next/Iterator Randomで選択し、Camera ShotのChange Targetに渡す
Nested Accessで装備武器の耐久値を参照
- PlayerにLocal Name Variablesを置き、
equipped : GameObject(現在の武器参照) - 各武器PrefabにLocal Name Variablesを置き、
durability : Number - 参照キーは
equipped/durability(スラッシュで連結) - 攻撃時にSet命令で
equipped/durabilityを-1
Save対象外のフラグ
「画面設定がロード直後は初期値に戻ってほしい」などの値は、SaveをOFFにしたGlobal Name Variableを使います。
Signalと併用したゆるいUI更新
- 変数が変化したら直接UIを呼ぶかわりに
Emit Signalで"score-changed"を発火 - UI側は
On Receive Signalで受けて更新 - 複数のUI(HUD/ポーズ画面)が同じシグナルを購読できるため保守性が高い設計です
Tipsと注意点
- 一意のIDを守ること:Save対象の変数でIDが衝突するとロード時に上書きされ、思わぬバグになります。
Regenerateを忘れずに - ListのピボットはIListGetPick:C#からList操作する際、インデックスを直接
intで渡すわけではなくPick抽象を通します。既存ピック実装(先頭/末尾/ランダム/指定インデックス)を利用するか、カスタムPickを作ります - Nested Accessで型を混ぜない:
a/b/cの各段で実際に存在する変数名を辿るので、途中段の型がGameObject以外だと解決できません - Global変数はシーンまたぎで便利だが乱用注意:本来シーン内でしか意味のない値をGlobalに置くと、シーン切替時に予期せぬ残留値が出ます。スコープは小さく保ちましょう
- Texture/Sprite/GameObjectは保存されない:ロード後も保持したいなら、復元可能なID(例:
"weapon_sword_iron")をStringで持ち、そのIDからロード時にオブジェクトを再解決する方式が定石です - 変数変更イベントは頻繁に発火する:毎フレーム変わる値にTriggerを繋ぐとパフォーマンスが落ちます。必要なら
On Intervalで間引くか、Signalで明示的に通知するほうが良いです - Propertyを使えば再利用性が跳ね上がる:カスタムコンポーネントのフィールドを
public string foo;ではなくpublic PropertyGetString foo;に書き換えるだけで、変数やPlayer参照からも値を供給できるようになります
公式リンク
まとめ
本記事ではGame Creator 2のVariables(変数)について解説しました。如何だったでしょうか。
VariablesはName Variables(名前付き)とList Variables(配列)の2種類を、Local(シーン内)とGlobal(シーン間)の2スコープで管理できるシンプルかつ強力なデータコンテナです。
Nested Accessによる動的な参照チェーンや、Propertiesによるノーコード/コード両対応の値取得など、柔軟な設計が可能になっています。
次回はAdvanced(応用機能)について解説していきます。
それでは次の記事も閲覧いただけると幸いです。
📚 シリーズ:Game Creator 2 完全ガイド(5/16)



