Class VariablesとLocal Variablesの概要
Blueprintで変数を定義する方法は、大きく分けて2つあります。
- Class Variables (クラス変数 / メンバ変数): Blueprintの「Variables」パネルで作成する変数。
- 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として返す
この例では、IntermediateDamageはCalculateFinalDamage関数が実行されている間だけ必要です。関数が終了すれば不要になるため、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. 複数の関数やイベントで参照・更新されるか? | YES | NO |
| Q3. 処理が終了した後も値を保持する必要があるか? | YES | NO |
| Q4. 1つの関数/イベント内でのみ使われる一時的なデータか? | NO | YES (中間計算、一時的な参照) |
| Q5. 処理が終わったら値を破棄して問題ないか? | NO | YES |
結論: Blueprintをクリーンに保ち、バグを防ぐためには、「ステート(状態)はClass Variable、プロセス(処理)はLocal Variable」 という明確な区別を持つことが、Unreal Engine開発者としての第一歩です。