宝箱に鍵を付け、開く動きも加えた。すると、開いている途中でキーを連打したら動きが最初に戻ったり、リセットしたはずの箱が少し後にまた開いたりすることがあります。「今どんな状態か」と「その状態で何を受け付けるか」が、別々の場所に散らばると起きやすい問題です。
Enum を使うと、宝箱の状態を「施錠中」「解錠済み」「開いている途中」「開き終わった」のどれか1つで表せます。Switch は、その値に応じて処理の行き先を分けるノードです。この記事では小さな宝箱を作り、状態を切り替えるだけでなく、途中でやめるときの動作まで揃えます。

この記事でわかること
- BooleanとEnumを、何を表したいかで使い分ける考え方
- Enumの作成と、Switchで状態ごとに処理を分ける手順
- 状態変更の入口をまとめ、動きの停止と開始を揃える方法
- 連打と途中リセットで、状態管理の効果を確かめる実践
Enumは「今どれか1つ」を表す
Boolean(bool) は、trueかfalseかの2択を表します。「効果音を鳴らすか」のようなオン・オフに使いやすい型です。
一方、今回の宝箱には4つの状態を用意します。
| 状態 | 意味 | 開く操作をしたら |
|---|---|---|
Locked | 鍵が掛かっている | 開かない |
Closed | 鍵は外れているが、ふたは閉じている | 開き始める |
Opening | ふたが動いている途中 | 今の動きを続ける |
Open | 開き終わっている | そのまま |
ここでのClosedは「閉じている物すべて」ではなく、解錠済みで開けられる状態 です。Lockedと見た目が同じでも、受け付ける操作が違います。
これを IsLocked、IsOpening、IsOpen という別々のBooleanで持つこともできます。ただし、1つをtrueへ変えるときに、ほかをfalseへ戻す必要が出てきます。戻し忘れると、この宝箱のルールでは使わない「施錠中なのに開いている途中」という組み合わせも保存できてしまいます。
Enum(列挙型) は、決めておいた選択肢の中から1つの値を持つ型です。CurrentState という変数をEnum型にすれば、4つの状態から1つを持ち、LockedとOpeningが同時に入ることはありません。複数の旗を揃えて書き換える手間を減らせます。

ただし、Enumは状態の名前を持つだけです。ふたを動かす処理や、鍵が掛かっている間は開けない判定まで自動で作られるわけではありません。そこをSwitchと、自分で作る処理でつないでいきます。
移動しながら攻撃できるゲームなら、「移動中」と「攻撃中」は同時に成立して構いません。何でも1つのEnumへ押し込むのではなく、同じ観点で、今どれか1つに決めたいものをまとめる と考えてください。
実践の準備:4つの状態を持つ宝箱
Third PersonのBlueprintプロジェクトを使います。新規作成時に「Variant」がある版では None を選びます。変数と関数を作り、ピンをつなぐ操作が分かれば進められます。
練習用の宝箱は、Cubeを本体とふたに見立てて作ります。蝶番で回す形ではなく、ふたが2秒かけて真上へ100cm持ち上がる形です。状態と動きの関係を見やすくするため、形はシンプルにしています。
F:鍵を外すE:開ける。開いている途中なら、動きをやり直さないR:途中でも動きを止め、施錠した閉じた箱へ戻す

本体とふたを置く
- Actorを親にBlueprint Class
BP_StateChestを作ります。 - Static Meshコンポーネントを2つ加え、
BodyとLidと名付けます。どちらもDefaultSceneRootの子にします。 - 両方へ標準のCube(
Engine/BasicShapes)を割り当てます。見つからなければ、アセット選択欄でエンジンコンテンツの表示をオンにします。 - 次の表に合わせ、回転は両方とも0にします。「Mobility」はMovable、「Simulate Physics」はオフ、「Collision Presets」はNoCollisionです。
Movableは、ゲーム中に位置などを変えられる設定です。今回はふたをBlueprintか ら動かします。
| コンポーネント | Relative Location | Scale |
|---|---|---|
| Body | X=0 / Y=0 / Z=50 | X=2 / Y=1.5 / Z=1 |
| Lid | X=0 / Y=0 / Z=110 | X=2 / Y=1.5 / Z=0.2 |
Relative Location は、親を基準にした位置です。ここでは箱のRootから測った位置で、Bodyの底がRootの高さに、Lidの底がBodyの上面に揃います。
BP_StateChestをレベルへ1つ置き、Actor自体のScaleは 1, 1, 1、Rootの高さは床に合わせます。プレイヤーの開始位置から見える場所へ置いてください。今回はキーで動きを試すので、接触判定は使いません。
Enumを作り、変数の型にする
コンテンツブラウザで右クリックし、「Blueprints」→「Enumeration」を選びます。E_ChestState と名付けて開き、「Add Enumerator」で次の4項目を作ります。
| Display Name | Descriptionに書く説明の例 |
|---|---|
| Locked | 施錠中。開く操作は受け付けない |
| Closed | 解錠済み。開く操作を受け付ける |
| Opening | ふたが開いている途中 |
| Open | 開き終わった |
Display Name は、変数の選択欄やSwitchのピンに出る名前です。Descriptionは、後から意味を思い出すための説明に使えます。今回の名前は表に揃え、保存します。
BP_StateChestへ CurrentState 変数を作ります。型の検索欄で E_ChestState を選び、コンパイル後、既定値を Locked にします。Enumアセットが「選択肢の一覧」、変数が「この箱が今選んでいる値」という関係です。

Switchで状態に合った処理を呼ぶ
まずは、状態ごとに文字が出るところまで作ります。BP_StateChestに EnterChestState という関数を追加し、「Pure」はオフにします。入力 State を加え、型をE_ChestStateにします。戻り値は使いません。
Pureをオフにするのは、白い実行ピンで呼び、表示や位置の変更をする関数にするためです。
この関数は、指定した状態に入ったときの処理 をまとめる場所です。現段階では表示だけを置き、後でふたの動きを加えます。
- 関数の入口にあるStateの出力から線を引き、
Switchを検索してSwitch on E_ChestStateを作ります。StateをそのSelectionへつなぎます。 - 関数入口の白い実行出力もSwitchの白い入力へつなぎます。
- SwitchのLocked・Closed・Opening・Openから、それぞれ別の
Print Stringを呼びます。 - 表示文字はピンと同じ名前にします。4つとも「Print to Screen」をオン、Durationを
5にします。

Switchは、白い実行線が来た時点のSelectionを読み、一致する出口へ進みます。Enumの値をどこかで変更しただけでは、このSwitchは実行されません。
イベントグラフへ戻り、Event BeginPlay → EnterChestState をつなぎます。呼び出しのStateへ Get CurrentState を渡します。コンパイルしてPlayすると Locked が表示されれば、最初の分岐はできています。
Playを止め、CurrentStateの既定値をClosedへ変えて再開すると、今度は Closed が出ます。試したらLockedへ戻します。この段階ではPrintだけなので、箱の見た目は変わりません。
状態を変える前に、今の動きを止める
これから「開く」「リセットする」といった操作を加えます。その前に、状態の変更をどこへ書くかを決めておきましょう。
たとえば、開いている途中でCurrentStateをLockedに変え、ふたを閉じた位置へ戻すだけでは不十分です。ふたを動かしている処理が残っていれば、次の更新でまた上へ動かされます。
そこで、状態変更は ChangeChestState という関数へまとめ、次の順を通します。
- 同じ状態が指定されたら、そのまま終える
- 今のふたの動きを止める
- CurrentStateを新しい値へ変える
- EnterChestStateで、新しい状態の表示と動作を始める

このように、現在の状態と、次の状態へ移るルールを組み合わせたもの が、ここで作るステートマシンです。「状態遷移」は、ClosedからOpeningへ移る、といった状態の切り替わりを指します。
同じ状態を指定したときに終えるのは、Opening中の「もう一度Openingにして」という要求で、動きを最初から始め直さないためです。これだけで、すべての遷移を許可・禁止できるわけではありません。施錠中に開けない条件は、後で操作側へ書きます。
実践:ふたの動きと操作をつなぐ
1. 2秒で0から1になるTimelineを作る
Timeline は、時間に合わせて値を変える仕組みです。今回は2秒間で0から1へ増える値を作り、ふたがどこまで開いたかに使います。
BP_StateChestのイベントグラフで右クリックし、Add Timeline を選んで TL_Open と名付けます。ダブルクリックして開き、Float Trackを追加して Alpha と名付けます。
Float Trackのグラフを右クリックしてキーを2つ追加し、それぞれ選んでTimeとValueを揃えます。キー は「この時刻には、この値にする」という目印です。
| キー | Time | Value |
|---|---|---|
| 始まり | 0 | 0 |
| 終わり | 2 | 1 |
キーを選んで右クリックし、補間をLinearにします。これは、キーとキーの間で値を一定のペースで変える設定です。Lengthは 2、AutoPlayとLoopはオフにします。Alpha は今回「どこまで進んだか」を表す値で、0なら始まり、0.5なら半分、1なら終わりです。
イベントグラフへ戻ります。このTimelineノードは、後で使うためそのまま置いておきます。Timeline本体は関数の中へ移しません。 再生を始めた後も、時間をかけて更新する部分だからです。
2. 状態変更用の関数を組む
関数 ChangeChestState を作り、Pureをオフにします。入力は NewState、型はE_ChestStateです。
- Get CurrentStateから
==を検索し、Enumの比較を作ります。もう片方の値へ、関数入力のNewStateを渡します。 - 関数入口の白い出力をBranchへ、比較結果をConditionへつなぎます。
- Trueは空けます。同じ状態なので、ここで終わります。
- Falseから
Stop、Set CurrentState、EnterChestStateの順につなぎます。 - Set CurrentStateの値と、EnterChestStateのStateには、どちらもNewStateを渡します。
