Unity

【Unity】Game Creator 2 変数(Variables)完全解説

【Unity】Game Creator 2 変数(Variables)完全解説

当サイトを閲覧いただきありがとうございます。

本記事では、Game Creator 2のコア機能のひとつである「Variables」(変数)について詳しく解説します。

Variablesはゲームの進行状況や動的な値を格納するためのデータコンテナです。スコア/ライフ/装備中の武器参照/シーン上の敵リストなど、ゲーム内で変化するあらゆる値に使います。

公式ドキュメント:Game Creator 2 Documentation


Variablesとは

  • 値を動的に変更できるデータコンテナ
  • 名前(Name)または添字(Index)で識別する
  • **ローカル(シーン内)/グローバル(シーン間)**で持ち方を選択できる
  • セーブ・ロード対象にもなる(プリミティブ型のみ)

:プレイヤーのスコアを保持する score というName Variableを用意。初期値0。星を取るたびに加算、UIに反映、といった使い方です。


2種類の変数 ― NameとList

Name Variables(名前付き)

  • 一意の名前で識別する
  • 例:score = 47equippedWeapon = (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 VariablesList Variablesの両方がある

Global Variables

  • プロジェクト全体で共有。どのシーンからでも参照/変更可能
  • ScriptableObjectアセットとして作成。ランタイム値は内部のシングルトンマネージャが保持
  • Name VariablesList Variablesの両方がある

IDの衝突

どちらのスコープでも、同じIDの変数が2つあると互いに値を上書きしあいます。衝突メッセージが出たら、IDフィールドを展開 → Regenerate で新しい一意なIDを生成してください。


Value Types(値の型)

初期値を設定する際に選べるデフォルトの型一覧です(モジュール追加で増えることもあります)。

用途セーブ対応
Number数値。整数・小数の両対応
Stringテキスト
Booleantrue / false
Vector 3(x, y, z) ベクタ
ColorRGBA(HDR含む)
TextureTextureアセット参照
SpriteSpriteアセット参照
MaterialMaterialアセット参照(v2.13.43以降)
Animation ClipAnimationClipアセット参照(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クラス

  • PropertyGetNumberPropertySetNumber
  • PropertyGetStringPropertySetString
  • PropertyGetBoolPropertySetBool
  • PropertyGetGameObjectPropertySetGameObject
  • PropertyGetPositionPropertyGetDirection
  • PropertyGetColorPropertyGetTexturePropertyGetSprite など

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 IDLocal Name/List変数のIDを変更(Savableでない変数のみName(新ID)
Clear ListListの全要素を削除List Variable
Collect Characters指定位置から Min〜Max Radius の距離にあるCharacterをリストに収集。Filter(Conditions)で絞込可能Origin/Max Radius/Min Radius/Store In/Filter
Collect Markers同上、対象がMarkerOrigin/Max Radius/Min Radius/Store In/Filter
Filter ListListの各要素を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 Random0〜要素数のランダム値をIndexに格納Index/List Variables
Loop ListGame Object Listを反復し、各要素にActionsを実行(各回 Target に要素をセット)List Variable/Actions
Move ListList内のある要素を別位置へ移動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 ListListの2要素を入替List Variable

変数の値そのものを直接読み書きする命令(Set Number など)は Math > ArithmeticMath > Boolean 等のカテゴリに分かれて存在します。詳細はVisual Scriptingの記事を参照してください。

Conditions(1)

条件判定内容主なパラメータ
List Is Empty指定List Variableが空ならtrueList Variables

「変数の値が等しいか」を判定するには Math > Arithmetic > Compare Decimal / Compare IntegerMath > Boolean > Compare BooleanText > Text Equals など値の型に応じたCompare系Conditionを使います。

Events(4)

Trigger コンポーネントから変数の変化を購読します。

イベント発火タイミング
On Global Name Variable ChangeGlobal Name変数が変更された瞬間
On Global List Variable ChangeGlobal List変数が変更された瞬間
On Local Name Variable ChangeLocal Name変数が変更された瞬間
On Local List Variable ChangeLocal List変数が変更された瞬間

これらのイベントで「スコアが増えたらUIを更新」「ターゲットが変わったらアイコンを差し替え」といった処理を疎結合に書けます。


実践的な使い方 ― やりたいこと別の構成ガイド

スコア管理

  1. Global Name Variablesアセットを作り、score : Number = 0 を追加
  2. アイテム取得時のTriggerのInstructionで Increment Numberscore を+10
  3. UI Text側ではTriggerのEventを On Global Name Variable Change にして、Change Text で再描画

敵ロックオン候補をリスト化

  1. Local List VariablesをPlayerに付け、targets : GameObject タイプで作成
  2. Collect Characters InstructionでPlayer周囲10m内のCharacterを targets に収集、FilterTag == "Enemy"
  3. Sort List By Distance でPlayerからの距離順に整列
  4. Iterator NextIterator Random で選択し、Camera Shotの Change Target に渡す

Nested Accessで装備武器の耐久値を参照

  1. PlayerにLocal Name Variablesを置き、equipped : GameObject(現在の武器参照)
  2. 各武器PrefabにLocal Name Variablesを置き、durability : Number
  3. 参照キーは equipped/durability(スラッシュで連結)
  4. 攻撃時に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 完全ガイド シリーズ総合案内senkohome.com/gamecreator2-series-index/

それでは次の記事も閲覧いただけると幸いです。