ここは FMK パラダイムの“心臓部”だよ。
Mode の状態遷移図(StateMachine)を設計するということは、

「行動を、開始 → 維持 → 終了 の流れとして工学的に扱う」

ということ。

MVC では絶対に扱えない領域で、
FMK が「Roblox の行動 OS」として成立するための最後の柱になる。

ここでは、
FMK に完全準拠した Mode の状態遷移図(StateMachine)
体系として提示する。


🟩 Mode の StateMachine は 3 層で構成される

FMK の Mode は、次の 3 層の状態を持つ。

  1. Activation(起動)
  2. Active(稼働)
  3. 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(中断・再開)

どこを深掘りしたい?