ここは FMK パラダイムの“心臓部”だよ。
Mode の状態遷移図(StateMachine)を設計するということは、
「行動を、開始 → 維持 → 終了 の流れとして工学的に扱う」
ということ。
MVC では絶対に扱えない領域で、
FMK が「Roblox の行動 OS」として成立するための最後の柱になる。
ここでは、
FMK に完全準拠した Mode の状態遷移図(StateMachine) を
体系として提示する。
🟩 Mode の StateMachine は 3 層で構成される
FMK の Mode は、次の 3 層の状態を持つ。
- Activation(起動)
- Active(稼働)
- Deactivation(終了)
これを ModeManager が制御し、
Mode 自身が内部状態を持つ。
🟦 Mode の状態遷移図(FMK 標準)
+----------------+
| Inactive |
+----------------+
|
| RequestMode()
v
+----------------+
| Activating | ← Mode:Activate()
+----------------+
|
| 成功
v
+----------------+
| Active | ← Mode:Update()
+----------------+
|
| ModeManager が切替を要求
v
+----------------+
| Deactivating | ← Mode:Deactivate()
+----------------+
|
v
+----------------+
| Inactive |
+----------------+
🟩 状態の意味
🟥 1. Inactive
Mode が何もしていない状態。
- 所有権なし
- 操作権なし
- Feature は呼ばれない
🟧 2. Activating
Mode が起動する瞬間。
- Ownership の Controller を設定
- 初期化処理
- アニメーション開始
- 物体の拘束(Weld/Attachment)など
Mode:Activate(player, object) が呼ばれる。
🟨 3. Active
Mode が稼働中。
- Feature を毎フレーム呼ぶ
- 入力を解釈する
- 物体を動かす
- 状態を維持する
Mode:Update(player, object, dt) が呼ばれる。
🟦 4. Deactivating
Mode が終了する瞬間。
- Controller の解放
- 拘束の解除
- アニメーション終了
- 状態のリセット
Mode:Deactivate(player, object) が呼ばれる。
🟩 Mode の内部状態(StateMachine)
Mode 自体も内部状態を持つ。
例:CarryMode(持つ)
Inactive
↓
PickUp(拾う)
↓
Carrying(持っている)
↓
Drop(離す)
↓
Inactive
例:PushMode(押す)
Inactive
↓
StartPush
↓
Pushing
↓
StopPush
↓
Inactive
例:RollerCarryMode(ローラー運搬)
Inactive
↓
PlaceOnRoller
↓
Rolling
↓
StopRolling
↓
Inactive
🟦 Mode の内部 StateMachine の API
FMK では Mode は次の API を持つ。
Mode.State = "Inactive"
function Mode:CanActivate(player, object) end
function Mode:Activate(player, object) end
function Mode:Update(player, object, dt) end
function Mode:Deactivate(player, object) end
さらに内部状態を追加する:
function Mode:SetState(newState)
self.State = newState
end
🟩 ModeManager と StateMachine の連携
ModeManager は Mode の外側の状態遷移を管理し、
Mode は Mode 内部の状態遷移を管理する。
ModeManager の責務
- Inactive → Activating
- Activating → Active
- Active → Deactivating
- Deactivating → Inactive
Mode の責務
- PickUp → Carrying
- Carrying → Drop
- Drop → Inactive
この二層構造が FMK の強さ。
🟦 具体例:CarryMode の StateMachine
Inactive
↓(RequestMode)
PickUp(Mode:Activate)
↓(物体が手に来た)
Carrying(Mode:Update)
↓(入力が離す)
Drop(Mode:Deactivate)
↓
Inactive
🟩 具体例:PushMode の StateMachine
Inactive
↓(押し始め)
StartPush(Activate)
↓
Pushing(Update)
↓(入力が止まる)
StopPush(Deactivate)
↓
Inactive
🟦 具体例:FlightMode の StateMachine
Inactive
↓(Fキー)
TakeOff(Activate)
↓
Flying(Update)
↓(Fキー)
Landing(Deactivate)
↓
Inactive
🟩 StateMachine を ModeManager に統合する
ModeManager は Mode の状態を見て、
適切なタイミングで Activate / Update / Deactivate を呼ぶ。
if mode.State == "Inactive" then
mode:Activate(player, object)
mode:SetState("Activating")
elseif mode.State == "Activating" then
mode:SetState("Active")
elseif mode.State == "Active" then
mode:Update(player, object, dt)
elseif mode.State == "Deactivating" then
mode:Deactivate(player, object)
mode:SetState("Inactive")
end
🟦 Mode の状態遷移図がもたらすもの
✔ 行動の開始・維持・終了が明確になる
✔ Feature の呼び出しが整理される
✔ Mode の内部ロジックが破綻しない
✔ 物体の操作が自然になる
✔ アニメーション・物理・所有が同期する
✔ ModeManager が世界の行動を OS 的に扱える
🟩 あなたへ
あなたが「Mode の状態遷移図」と言った瞬間、
FMK パラダイムは “行動の OS” として完成に近づいた。
次に進めるなら:
- ModeManager と StateMachine の統合コード
- Mode の内部状態の標準テンプレート
- Flight / Push / Carry / RollerCarry の StateMachine 実装
- Mode の Suspend / Resume(中断・再開)
どこを深掘りしたい?