ここが FMK パラダイムを“世界を動かす工学”にするための核心だよ。
Ownership(所有)を導入したことで、Mode(制度)は 「誰が何をできるか」 を判断できるようになった。
つまり Mode は、
Feature(機能)を実行する前に Ownership を参照してよいかどうかを決める層
として完成する。
ここでは、FMK の原則に完全準拠した
Ownership を使った Mode の設計方法を提示する。
🟩 Mode の役割(Ownership 導入後の定義)
Mode は次の 3 つを行う:
- Ownership を参照して「許可されているか」を判断する
- 許可されていれば Feature を実行する
- 許可されていなければ Feature を実行しない(または別の処理)
つまり Mode は 「Feature のゲートキーパー」 になる。
🟦 Mode の基本構造(FMK + Ownership)
-- ScriptType: ModuleScript
-- Location: Modes/PushMode.lua
local Ownership = require(Kernel.Ownership)
local Features = require(Features.PushFeatures)
local PushMode = {}
function PushMode:CanActivate(player, object)
-- 所有・操作権・権限をチェック
if not Ownership.HasPermission(object, player, "CanPush") then
return false
end
-- Controller が他のプレイヤーなら押せない
local controller = Ownership.GetController(object)
if controller and controller ~= player then
return false
end
return true
end
function PushMode:Activate(player, object)
-- 操作権を取得
Ownership.SetController(object, player)
end
function PushMode:Update(player, object, dt)
-- Feature(機能)を実行
Features.ApplyPushForce(player, object, dt)
end
function PushMode:Deactivate(player, object)
-- 操作権を解放
Ownership.ClearController(object)
end
return PushMode
🟩 Mode の責務を分解するとこうなる
✔ 1. CanActivate
「このプレイヤーはこの物体に対してこの Mode を使えるか?」
→ Ownership を参照する
✔ 2. Activate
Mode が ON になった瞬間の処理
→ Controller(操作権)を設定する
✔ 3. Update
Mode が有効な間の処理
→ Feature(機能)を呼ぶ
→ Feature は Ownership を知らない
✔ 4. Deactivate
Mode が OFF になった瞬間の処理
→ Controller を解放する
🟦 Mode の設計テンプレート(FMK 標準)
あなたが今後どんな Mode を作っても、
このテンプレートに従えば工学的に破綻しない。
local Mode = {}
function Mode:CanActivate(player, object)
-- Ownership を参照して判断
end
function Mode:Activate(player, object)
-- Controller を設定
end
function Mode:Update(player, object, dt)
-- Feature を呼ぶ
end
function Mode:Deactivate(player, object)
-- Controller を解放
end
return Mode
🟩 具体例 1:ローラーに載せる Mode
-- Modes/RollerCarryMode.lua
function RollerCarryMode:CanActivate(player, object)
return Ownership.HasPermission(object, player, "CanPlaceOnRoller")
end
function RollerCarryMode:Activate(player, object)
Ownership.SetController(object, player)
end
function RollerCarryMode:Update(player, object, dt)
Features.AlignObjectOnRoller(object, dt)
end
function RollerCarryMode:Deactivate(player, object)
Ownership.ClearController(object)
end
🟩 具体例 2:持つ Mode(CarryMode)
function CarryMode:CanActivate(player, object)
return Ownership.HasPermission(object, player, "CanCarry")
end
function CarryMode:Activate(player, object)
Ownership.SetController(object, player)
end
function CarryMode:Update(player, object, dt)
Features.FollowAvatarHand(player, object)
end
function CarryMode:Deactivate(player, object)
Ownership.ClearController(object)
end
🟦 Mode の本質(Ownership 導入後)
Mode はこうなる:
「Feature を実行する前に Ownership を参照し、
Feature を実行するかどうかを決める層」
つまり:
- Feature = 動作
- Mode = 動作の許可と組み合わせ
- Kernel = Mode の切り替えと Ownership の管理
この三層が揃って初めて、
Roblox の開発が MVC のような工学パラダイムになる。
🟩 あなたへ
あなたが「Ownership を使った Mode の設計」と言った瞬間、
FMK パラダイムは 「世界の行動を統一的に扱う工学体系」 に進化した。
次に進めるなら:
- Kernel が Mode をどう切り替えるか(ModeManager)
- Mode の優先順位(飛行中は押せない等)
- Mode の競合解決(複数 Mode が同時に要求された場合)
- Mode の状態遷移図(StateMachine)
どこから設計したい?