ここが PatchMotions の“内部OS”の心臓部だね。
パッチを貼る UI が外側の操作体系なら、
MotionNode は内側の構造体系(OS のカーネル)。
ここを正しく設計すると、PatchMotions 全体が
「貼る → 構造が生まれる → 時間を予約する → 動く」
という 一貫した OS として成立する。
ここでは、あなたのレイヤー思想に合わせて
MotionNode の正式仕様(データ構造) を定義する。
🟣 PatchMotions:MotionNode の正式仕様
“パッチ1枚=MotionNode1つ”
これが OS の基本ルール。
🟠 MotionNode のトップレベル構造
MotionNode = {
Id = string, -- 一意のID
PatchType = "Fix" | "Slide" | "Rotate",
PartA = Instance, -- 接続元
PartB = Instance, -- 接続先
Attachments = {}, -- Attachment の参照
Constraint = Instance, -- Hinge / Prismatic / Weld
Schedule = {}, -- 時間の予約
State = {}, -- 実行時の内部状態
Visual = {}, -- パッチの見た目・UI
}
これが PatchMotions の OS カーネル構造。
🟡 ① PatchType(パッチの種類)
PatchType = "Fix" | "Slide" | "Rotate"
- Fix → WeldConstraint
- Slide → PrismaticConstraint
- Rotate → HingeConstraint
パッチの種類が OS の動作を決める。
🟢 ② PartA / PartB(接続対象)
PartA = 貼られた側の Part
PartB = もう一方の Part
- Fix → 完全固定
- Slide → 直線運動
- Rotate → 回転運動
構造レイヤーの“接続関係”を表す。
🔵 ③ Attachments(Constraint の基点)
Attachments = {
A0 = Attachment,
A1 = Attachment,
}
- Slide / Rotate は必須
- Fix は不要(Weld は Attachment を使わない)
OS が自動生成する“構造の基点”。
🟠 ④ Constraint(物理レイヤー)
Constraint = HingeConstraint or PrismaticConstraint or WeldConstraint
Constraint は 構造レイヤーの実体。
MotionNode は Constraint を 抽象化した OS オブジェクト。
🟣 ⑤ Schedule(時間レイヤー:運動の予約)
PatchMotions の魂。
Schedule = {
StartTime = number, -- 何秒後に開始するか
Duration = number, -- 1サイクルの長さ
Repeat = number, -- 何回繰り返すか(0 = 無限)
Mode = "Once" | "Loop" | "PingPong",
Target = number, -- 角度 or 距離
Easing = "Linear" | "EaseIn" | "EaseOut" | "EaseInOut",
}
Slide Patch の Target
→ 距離(studs)
Rotate Patch の Target
→ 角度(degrees)
Fix Patch
→ Schedule は空(動かない)
🟡 ⑥ State(実行時の内部状態)
State = {
Elapsed = 0, -- 経過時間
Cycle = 0, -- 現在のサイクル数
Direction = 1, -- PingPong 用
Active = false, -- 動作中かどうか
}
Motion Scheduler が毎フレーム更新する領域。
🟢 ⑦ Visual(パッチの見た目・UI)
Visual = {
PatchInstance = Instance, -- 貼られたパッチの見た目
Highlight = Instance, -- プレビュー時のハイライト
Icon = Instance, -- 時計アイコンなど
}
UI と内部構造を分離することで、
OS としての拡張性が高くなる。
🟣 MotionNode の完全モデル(まとめ)
MotionNode = {
Id = "Rotate_001",
PatchType = "Rotate",
PartA = torso,
PartB = arm,
Attachments = {
A0 = AttachmentA,
A1 = AttachmentB,
},
Constraint = HingeConstraint,
Schedule = {
StartTime = 1.0,
Duration = 0.5,
Repeat = 3,
Mode = "PingPong",
Target = 45,
Easing = "Linear",
},
State = {
Elapsed = 0,
Cycle = 0,
Direction = 1,
Active = false,
},
Visual = {
PatchInstance = patchModel,
Highlight = highlight,
Icon = clockIcon,
}
}
これが PatchMotions の OS カーネル構造。
貼る・剥がす・予約する・動く
すべてがこの MotionNode を中心に回る。
🔥 次に詰めると OS がさらに強くなるのはどれ?
A:Motion Scheduler(時間OS)の実行アルゴリズム
→ 毎フレームどう動作を更新するか
B:Schedule の文法(予約UIの正式仕様)
→ 時間をどう設定するか
C:MotionNode の保存・ロード(構造の永続化)
→ 生物やロボットを保存できる OS 機能
どれを進めたい?