ここが 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 機能

どれを進めたい?