【Unreal Engine】Blueprint変数入門:Class VariablesとLocal Variablesの正しい使い分け

作成: 2025-12-12

Blueprintの変数をClass VariableとLocal Variableのどちらで作るべきか迷ったときの判断基準。スコープの違いとバグを防ぐための使い分けを整理。

Class VariablesとLocal Variablesの概要

Blueprintで変数を定義する方法は、大きく分けて2つあります。

  1. Class Variables (クラス変数 / メンバ変数): Blueprintの「Variables」パネルで作成する変数。
  2. Local Variables (ローカル変数): 関数やイベントグラフの内部でのみ作成できる変数。

この2つの違いを理解せず、すべてをClass Variablesとして定義してしまうと、Blueprintが肥大化し、意図しないバグが発生しやすくなります。本記事では、これら2種類の変数の役割と正しい使い分けの原則を解説します。

Class VariablesとLocal Variablesの特性

まずは、それぞれの変数が持つ特性と役割を明確に理解しましょう。

Class Variables (クラス変数 / メンバ変数)

特性説明
定義場所Blueprintエディタの「Variables」パネル
スコープBlueprintインスタンス全体
ライフサイクルBlueprintインスタンスの生成から破棄まで値が保持される
アクセスBlueprint内のすべての関数、イベント、グラフからアクセス・変更が可能。外部のBlueprintからもアクセス可能(Public設定時)
主な用途オブジェクトの状態(ステート)、設定値、永続的な参照

Class Variables は、そのBlueprint(オブジェクト)が「今どのような状態にあるか」を定義するために使われます。例えば、プレイヤーキャラクターのHP現在の移動速度ターゲットとしている敵の参照 など、オブジェクトのライフサイクルを通じて保持され、複数の処理で参照・更新されるべきデータがこれに該当します。

Local Variables (ローカル変数)

特性説明
定義場所関数(Function)内で、My Blueprintパネルの「Local Variables」セクションから作成
スコープ変数が作成された関数の実行ブロック内のみ
ライフサイクル関数の開始時に作成され、関数の終了時に破棄される
アクセス定義された関数内でのみアクセス・変更が可能。外部からのアクセスは一切不可
主な用途一時的な計算結果、中間データ、特定のノードの出力の再利用

💡 重要な補足:Local VariablesはFunction内で定義する

UE5では、Local VariablesはFunction(関数)内でのみ定義可能 です。イベントグラフ内で直接ローカル変数を作成することはできません。イベントグラフで一時的な値を保持したい場合は、処理をFunctionに分割するか、Class Variableを使用してください。

Local Variables は、特定の処理を実行する際に、一時的に値を保持するためだけに使われます。例えば、「AとBを計算した結果をCに格納し、そのCを使ってDを計算する」といった、1つの関数やイベント内で完結する中間データ の保持に最適です。処理が終わればメモリから解放されるため、非常にクリーンです。


正しい使い分けの原則

変数の使い分けは、以下の 「スコープの最小化」 という原則に基づくと明確になります。

ベストプラクティス原則: その変数が1つの関数/イベント内でしか使われないのであれば、必ずLocal Variablesとして定義する。 オブジェクトの状態や設定値など、複数の関数/イベントで共有・永続化する必要があるものだけをClass Variablesとして定義する。

Class Variablesの活用例

プレイヤーキャラクターのHPを管理する例を考えます。HPは、ダメージを受けるイベント、回復するイベント、UI表示の更新など、複数の場所で参照・更新される「オブジェクトの状態」です。

Class Variablesとして定義すべき変数:

  • CurrentHP (Integer/Float): 現在の体力
  • MaxHP (Integer/Float): 最大体力
  • IsDead (Boolean): 死亡状態

Blueprint例 (Class Variableの利用):

// Event Receive Damage (ダメージを受けた時のイベント)
// 1. Class VariableのCurrentHPを取得
// 2. CurrentHPからダメージ量を減算
// 3. 結果をCurrentHPにSet (Class Variableを更新)
// 4. CurrentHPが0以下かチェック
// 5. 0以下ならIsDeadをTrueにSet (別のClass Variableを更新)

この場合、CurrentHPはダメージイベントだけでなく、回復関数やUI更新イベントからも参照されるため、Class Variableとして定義するのが適切です。

Local Variablesの活用例

ある関数内で、複雑な計算を行い、その結果を一時的に利用する例を考えます。

Local Variablesとして定義すべき変数:

  • CalculatedDistance (Float): ターゲットまでの距離計算結果
  • FinalDamageMultiplier (Float): 複数のバフ・デバフを適用した最終的なダメージ倍率

Blueprint例 (Local Variableの利用):

// Function: CalculateFinalDamage
// 1. Get Base Damage (Class Variable)
// 2. Get Buff Multiplier (Class Variable)
// 3. Base Damage * Buff Multiplier の結果を Local Variable: IntermediateDamage に Set
// 4. IntermediateDamage * Critical Hit Multiplier の結果を Local Variable: FinalDamage に Set
// 5. FinalDamageを関数のReturn Valueとして返す

この例では、IntermediateDamageCalculateFinalDamage関数が実行されている間だけ必要です。関数が終了すれば不要になるため、Local Variableとして定義することで、Blueprintの変数をクリーンに保ち、他の処理への影響を完全に排除できます。


よくある間違いとデバッグのヒント

すべてをClass Variablesにしてしまう

初心者が最も陥りやすい間違いは、一時的な計算結果や、関数内でしか使わない参照まで、すべてをClass Variablesとして定義してしまうことです。

問題点:

  • Blueprintの可読性低下: 変数リストが長くなり、本当に重要なステート変数が埋もれてしまう。
  • デバッグの困難さ: 意図しない場所で変数の値が変更され、バグの原因特定が難しくなる(「なぜこの値が変わったんだ?」)。
  • メモリの無駄: 処理が終わっても破棄されず、インスタンスが生きている限りメモリを占有し続ける(微々たるものですが、原則として避けるべき)。

デバッグ効率化のポイント

Local Variablesを積極的に使うことで、デバッグが劇的に楽になります。

  • スコープの保証: Local Variablesは関数/イベントの実行中しか存在しないため、その関数内でのみ値が変更されることが保証されます。もしバグがあれば、その関数内を調べれば良いと範囲が限定されます。
  • ノードの整理: 複雑な計算ノードが続く場合、Local Variableに一時的に結果を格納することで、ワイヤーが絡まるのを防ぎ、ノードグラフを整理できます。

ループ処理でのLocal Variableの重要性

For Loopなどのループ処理内で合計値を計算する場合、Local Variableを使わないと意図しない結果になることがあります。

// 悪い例:Class Variableを使ってループ内で合計を計算
// Function: CalculateTotalScore
// 1. For Each Loop (ScoreArray)
// 2. TotalScore (Class Variable) に Array Element を加算
// 問題点:関数を2回呼び出すと、前回の値が残っていて合計が2倍になる!

// 良い例:Local Variableを使ってループ内で合計を計算
// Function: CalculateTotalScore
// 1. Local Variable: RunningTotal を 0 で初期化
// 2. For Each Loop (ScoreArray)
// 3. RunningTotal に Array Element を加算
// 4. ループ終了後、RunningTotal を Return
// 利点:関数が呼ばれるたびにRunningTotalは0から始まるため、常に正確な合計が得られる

💡 ポイント

Class Variableはインスタンスが生きている限り値を保持するため、ループ処理の累積変数として使うと、前回の呼び出し時の値が残っている というバグの原因になります。ループ内の一時的な累積にはLocal Variableを使いましょう。


変数選択のチェックリスト

Class VariablesとLocal Variablesの使い分けは、Blueprintの品質を左右する重要な要素です。以下のチェックリストを参考に、変数を作成する際の判断基準としてください。

質問Class Variable (メンバ変数)Local Variable (ローカル変数)
Q1. オブジェクトの状態を保持するものか?YES (HP, 状態フラグ, 設定値)NO
Q2. 複数の関数やイベントで参照・更新されるか?YESNO
Q3. 処理が終了した後も値を保持する必要があるか?YESNO
Q4. 1つの関数/イベント内でのみ使われる一時的なデータか?NOYES (中間計算、一時的な参照)
Q5. 処理が終わったら値を破棄して問題ないか?NOYES

結論: Blueprintをクリーンに保ち、バグを防ぐためには、「ステート(状態)はClass Variable、プロセス(処理)はLocal Variable」 という明確な区別を持つことが、Unreal Engine開発者としての第一歩です。