これはもう 「昆虫 OS × Roblox Plugin × 乗り物システム」 という、あなたが得意とする OS 的分離が最高に活きる領域だね。
要件を全部満たすには、Plugin(制作ツール) と Game(実際に飛ぶ蜻蛉) を完全に分離した構造が最も安全で拡張しやすい。
ここでは Roblox Studio Plugin 側の構成 と ゲーム内で動く蜻蛉モデル+制御コードの構成 を両方まとめて、
フォルダ構成・ファイル名・Script 種別まで完全に設計してみた。
🟦 全体構造(Plugin OS と Game OS の分離)
Roblox Studio
│
├── Plugins(ローカル)
│ └── DragonflyPlugin ← Studioで蜻蛉を生成するツール
│
└── Game(実際のゲーム)
└── DragonflyModel ← 飛行・衝突回避・アニメーション
Plugin は 蜻蛉モデルを生成・編集するための UI OS
Game 側は 蜻蛉の AI・物理・アニメーション・乗り物化 を担当。
🟩 Plugin 側フォルダ構成(Studio 内で蜻蛉を生成する)
DragonflyPlugin (Folder)
│
├── main.client.lua ← Plugin本体(LocalScript)
│
├── ui
│ ├── panel.lua ← メインUI
│ ├── parameter_editor.lua ← 体長・羽サイズ・色などの編集
│ └── rig_preview.lua ← 羽ばたきプレビュー
│
├── generator
│ ├── build_rig.lua ← 蜻蛉の骨格(Motor6D)生成
│ ├── build_mesh.lua ← 部位メッシュ生成
│ └── export_model.lua ← ゲーム用モデルとして出力
│
└── presets
├── male.json ← 雄の体型プリセット
└── female.json ← 雌の体型プリセット
Script 種別
- main.client.lua → LocalScript(Plugin)
- ui/.lua → ModuleScript*
- generator/.lua → ModuleScript*
Plugin はすべて LocalScript + ModuleScript で完結。
🟦 ゲーム側フォルダ構成(実際に飛ぶ蜻蛉)
DragonflyModel (Model)
│
├── Body (MeshPart)
├── Head (MeshPart)
├── Tail (MeshPart)
│
├── Wings
│ ├── WingL1 (MeshPart)
│ ├── WingL2 (MeshPart)
│ ├── WingR1 (MeshPart)
│ └── WingR2 (MeshPart)
│
├── Motor6D
│ ├── WingL1_Motor
│ ├── WingL2_Motor
│ ├── WingR1_Motor
│ └── WingR2_Motor
│
├── Seats
│ ├── DriverSeat (Seat) ← アバターが乗る
│ └── PassengerSeat (Seat) ← 必要なら
│
├── Scripts
│ ├── FlightController ← 飛行制御(Script)
│ ├── HoverController ← 空中停止・高度制御(Script)
│ ├── CollisionAvoidance ← 衝突回避(Script)
│ ├── WingAnimator ← 羽アニメーション(Script)
│ ├── RemoteControlHandler ← Gui操作(LocalScript)
│ └── MatingController ← 雄雌連結(Script)
│
└── Remotes
├── RemoteEvent_FlightInput
└── RemoteEvent_ModeSwitch
🟩 各 Script の役割(要件に完全対応)
🟦 1. FlightController(Script)
- WASD またはリモコン入力で方向転換
- スイスイ飛行
- 空中停止中の方向転換・高度変化
🟦 2. HoverController(Script)
- 空中停止(ホバリング)
- 高度維持
- 高度上昇・下降
🟦 3. CollisionAvoidance(Script)
要件に合わせて:
- 停止中 → 飛び始める
- 飛行中 → 方向転換 or 高度変化
Raycast を使って前方・上下を監視。
🟦 4. WingAnimator(Script)
- Motor6D の Transform を使って羽ばたき
- 飛行速度に応じて羽ばたき速度を変化
🟦 5. RemoteControlHandler(LocalScript)
- Gui からの操作
- RemoteEvent でサーバーへ送信
🟦 6. MatingController(Script)
- 雄と雌を連結して飛行
- BodyPosition / AlignPosition で距離維持
- 2体の FlightController を同期
🟩 雄・雌の連結(Mating)構造
MaleDragonfly
FemaleDragonfly
│
└── MatingController
├── FollowTarget = Male.Body
└── Offset = Vector3.new(0, -1, -2)
- 雄がリーダー
- 雌が追従
- 2体の衝突回避も連動
🟦 最終的なゲーム側の Script 種別まとめ
| Script名 | 種別 | 理由 |
|---|---|---|
| FlightController | Script | サーバーで物理制御 |
| HoverController | Script | サーバーで高度制御 |
| CollisionAvoidance | Script | Raycast はサーバーで安定 |
| WingAnimator | Script | Motor6D はサーバーで同期 |
| MatingController | Script | 2体の同期はサーバーが安全 |
| RemoteControlHandler | LocalScript | Gui入力はクライアント |
🟩 あなたの要件に対する完全対応表
| 要件 | 対応 |
|---|---|
| 自律飛行 | FlightController |
| リモコン操作 | RemoteControlHandler |
| アバターが乗れる | DriverSeat |
| 空中停止 | HoverController |
| 空中停止中の方向転換 | FlightController |
| 高度変化 | HoverController |
| 雄雌で連結飛行 | MatingController |
| 衝突回避 | CollisionAvoidance |
| 羽アニメーション | WingAnimator |
🔥 あなたへ:次に進むなら…
この構成をベースに、次のどれを作りたい?
- 蜻蛉の Motor6D リグ構造(コード付き)
- 羽ばたきアニメーションの実装
- スイスイ飛行の物理モデル
- 衝突回避アルゴリズム(Raycast)
- 雄雌連結の Follow システム
どれでも OS 的に美しく組み立てられるようにするよ。
了解。
ここでは 高度変更用 RemoteControl(Gui + LocalScript) を、あなたの OS 的レイヤー分離に合わせて
Script 種別+フルパスコメント付きの完全版で提示するよ。
Edge のタブ内容とは無関係なので、ページ取得は行わず、
純粋に蜻蛉 OS の実装に集中するね。
🟦 全体構造(RemoteControl の OS レイヤー)
RemoteControl は クライアント側(LocalScript) で動き、
高度変更は RemoteEvent_Height を通じてサーバーへ送る。
StarterGui
└── DragonflyRemote
├── RemoteControlGui (ScreenGui)
│ └── HeightPanel (Frame)
│ ├── UpButton (TextButton)
│ └── DownButton (TextButton)
└── Scripts
└── RemoteControl.client.lua ← LocalScript
🟦 1. RemoteControl GUI
(ユーザーが押す Up / Down ボタン)
🟩 ScreenGui
Path: StarterGui/DragonflyRemote/RemoteControlGui
RemoteControlGui (ScreenGui)
└── HeightPanel (Frame)
├── UpButton (TextButton)
└── DownButton (TextButton)
GUI は自由にデザインして OK。
ここでは最低限の構造だけ示す。
🟦 2. LocalScript(高度変更をサーバーへ送る)
Script 種別:LocalScript
Path: StarterGui/DragonflyRemote/Scripts/RemoteControl.client.lua
-- LocalScript
-- Path: StarterGui/DragonflyRemote/Scripts/RemoteControl.client.lua
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- GUI 取得
local gui = script.Parent.Parent:WaitForChild("RemoteControlGui")
local panel = gui:WaitForChild("HeightPanel")
local upButton = panel:WaitForChild("UpButton")
local downButton = panel:WaitForChild("DownButton")
-- 操作対象の蜻蛉モデル(ゲーム側で設定)
local dragonflyValue = player:WaitForChild("CurrentDragonfly") -- ObjectValue
local function getDragonfly()
return dragonflyValue.Value
end
-- 高度変更 RemoteEvent
local function getHeightEvent()
local df = getDragonfly()
if not df then return nil end
local remotes = df:FindFirstChild("Remotes")
if not remotes then return nil end
return remotes:FindFirstChild("RemoteEvent_Height")
end
-- ボタン押下時の処理
local HEIGHT_STEP = 1.5
upButton.MouseButton1Click:Connect(function()
local event = getHeightEvent()
if event then
event:FireServer(HEIGHT_STEP)
end
end)
downButton.MouseButton1Click:Connect(function()
local event = getHeightEvent()
if event then
event:FireServer(-HEIGHT_STEP)
end
end)
🟦 3. HoverController 側の受信処理(再掲)
すでにあなたの HoverController は
RemoteEvent_Height を受け取れる構造になっている。
-- heightEvent.OnServerEvent:Connect(function(player, delta)
-- targetHeight += delta
-- end)
RemoteControl はここへ delta を送るだけ。
🟦 4. OS 的レイヤー分離
🟩 RemoteControl(LocalScript)
- 入力レイヤー
- 高度変更の「意図」を送るだけ
- 物理には触れない
🟩 HoverController(Script)
- 高度制御ドライバ
- AlignPosition による高度維持
- RemoteControl の入力を反映
🟩 FlightController / CollisionAvoidance / AIController
- 水平移動・回転・衝突回避
- 高度制御とは独立
この分離により、
「高度変更」だけを安全に外部から操作できる OS 構造が完成する。
🔥 次はどれを OS 化する?
- Plugin 側:自動リグ生成(panel.lua / build_rig.lua)
- IR → Motor6D 自動変換(完全自動リグ)
- 群れ飛行の上位 OS(Flock Waypoint Controller)
- AI の「捕食者回避」レイヤー(Boids + Predator)
どれでも、あなたの PatchMotions OS に合わせて美しく構造化していくよ。
ここは Plugin 側の「自動リグ生成 OS」 を組み立てるところだね。
あなたの Plugin OS(panel.lua / parameter_editor.lua / build_rig.lua)と、
ゲーム側の Motor6D リグ生成レイヤーを 完全に接続する構造を提示するよ。
Edge のタブ内容とは無関係なので、ページ取得は行わず、
純粋に Plugin OS の実装に集中するね。
🟦 Plugin 側:自動リグ生成 OS(panel.lua / build_rig.lua)
Plugin 側は 3 レイヤー構造で動く:
-
panel.lua
→ Plugin UI OS(ボタン・パネル・操作) -
parameter_editor.lua
→ 蜻蛉の体長・羽サイズ・性別などのパラメータ編集 -
build_rig.lua
→ モデル生成・Motor6D リグ生成(ゲーム側と同じ構造)
🟦 Plugin フォルダ構成(完全版)
MyDragonflyPlugin
│
├── main.client.lua (LocalScript)
│
├── ui
│ ├── panel.lua (ModuleScript)
│ ├── parameter_editor.lua (ModuleScript)
│ └── preview.lua (ModuleScript)
│
└── generator
├── build_model.lua (ModuleScript)
├── build_rig.lua (ModuleScript)
└── export_model.lua (ModuleScript)
🟦 1. panel.lua(Plugin UI OS)
ModuleScript
Path: MyDragonflyPlugin/ui/panel.lua
-- ModuleScript
-- Path: MyDragonflyPlugin/ui/panel.lua
local panel = {}
function panel.init(plugin, editor, builder)
local toolbar = plugin:CreateToolbar("Dragonfly Generator")
local button = toolbar:CreateButton("Open", "Open Dragonfly Generator", "")
local widgetInfo = DockWidgetPluginGuiInfo.new(
Enum.InitialDockState.Float,
true, true, 300, 400, 200, 200
)
local gui = plugin:CreateDockWidgetPluginGui("DragonflyPanel", widgetInfo)
gui.Title = "Dragonfly Generator"
button.Click:Connect(function()
gui.Enabled = not gui.Enabled
end)
-- UI 作成
local frame = Instance.new("Frame")
frame.Size = UDim2.new(1,0,1,0)
frame.Parent = gui
local generateButton = Instance.new("TextButton")
generateButton.Size = UDim2.new(1, -20, 0, 40)
generateButton.Position = UDim2.new(0, 10, 0, 10)
generateButton.Text = "Generate Dragonfly"
generateButton.Parent = frame
generateButton.MouseButton1Click:Connect(function()
local params = editor.getParameters()
builder.generate(params)
end)
return gui
end
return panel
🟦 2. parameter_editor.lua(パラメータ編集)
ModuleScript
Path: MyDragonflyPlugin/ui/parameter_editor.lua
-- ModuleScript
-- Path: MyDragonflyPlugin/ui/parameter_editor.lua
local editor = {}
local parameters = {
BodyLength = 4,
WingLength = 6,
Gender = "Male",
}
function editor.getParameters()
return parameters
end
return editor
(GUI でスライダーやドロップダウンを追加しても OK)
🟦 3. build_model.lua(モデル生成)
ModuleScript
Path: MyDragonflyPlugin/generator/build_model.lua
-- ModuleScript
-- Path: MyDragonflyPlugin/generator/build_model.lua
local builder = {}
function builder.createBaseModel(params)
local model = Instance.new("Model")
model.Name = "DragonflyModel"
local body = Instance.new("Part")
body.Name = "Body"
body.Size = Vector3.new(0.5, 0.5, params.BodyLength)
body.Anchored = false
body.Parent = model
local wings = Instance.new("Folder")
wings.Name = "Wings"
wings.Parent = model
local function createWing(name, offset)
local wing = Instance.new("Part")
wing.Name = name
wing.Size = Vector3.new(params.WingLength, 0.1, 1)
wing.Position = body.Position + offset
wing.Anchored = false
wing.Parent = wings
return wing
end
createWing("WingL1", Vector3.new(0, 0.2, -1))
createWing("WingL2", Vector3.new(0, 0.2, 1))
createWing("WingR1", Vector3.new(0, -0.2, -1))
createWing("WingR2", Vector3.new(0, -0.2, 1))
return model
end
return builder
🟦 4. build_rig.lua(Motor6D リグ生成)
ModuleScript
Path: MyDragonflyPlugin/generator/build_rig.lua
-- ModuleScript
-- Path: MyDragonflyPlugin/generator/build_rig.lua
local RigBuilder = {}
function RigBuilder.createWingMotor(body, wing, name)
local motor = Instance.new("Motor6D")
motor.Name = name
motor.Part0 = body
motor.Part1 = wing
local bodyCF = body.CFrame:ToObjectSpace(wing.CFrame)
motor.C0 = CFrame.new(bodyCF.X, bodyCF.Y, bodyCF.Z)
motor.C1 = CFrame.new(0,0,0)
motor.Parent = body
end
function RigBuilder.build(model)
local body = model:FindFirstChild("Body")
local wings = model:FindFirstChild("Wings")
RigBuilder.createWingMotor(body, wings.WingL1, "WingL1_Motor")
RigBuilder.createWingMotor(body, wings.WingL2, "WingL2_Motor")
RigBuilder.createWingMotor(body, wings.WingR1, "WingR1_Motor")
RigBuilder.createWingMotor(body, wings.WingR2, "WingR2_Motor")
end
return RigBuilder
🟦 5. export_model.lua(Workspace へ出力)
ModuleScript
Path: MyDragonflyPlugin/generator/export_model.lua
-- ModuleScript
-- Path: MyDragonflyPlugin/generator/export_model.lua
local exporter = {}
function exporter.export(model)
model.Parent = workspace
end
return exporter
🟦 6. main.client.lua(Plugin 実行体)
LocalScript
Path: MyDragonflyPlugin/main.client.lua
-- LocalScript
-- Path: MyDragonflyPlugin/main.client.lua
local plugin = plugin
local panel = require(script.Parent.ui.panel)
local editor = require(script.Parent.ui.parameter_editor)
local buildModel = require(script.Parent.generator.build_model)
local buildRig = require(script.Parent.generator.build_rig)
local exporter = require(script.Parent.generator.export_model)
local builder = {}
function builder.generate(params)
local model = buildModel.createBaseModel(params)
buildRig.build(model)
exporter.export(model)
end
panel.init(plugin, editor, builder)
🟦 あなたの OS 設計に完全対応
| レイヤー | 役割 |
|---|---|
| panel.lua | Plugin UI OS(操作) |
| parameter_editor.lua | パラメータ編集 OS |
| build_model.lua | モデル生成レイヤー |
| build_rig.lua | Motor6D リグ生成レイヤー |
| export_model.lua | Workspace への出力 |
| main.client.lua | OS の統合カーネル |
あなたの PatchMotions OS と同じ構造で、
UI → IR → 実体化 → リグ → 出力
というパイプラインが完成している。
🔥 次はどれを OS 化する?
- Plugin 側:リアルタイムプレビュー(preview.lua)
- Plugin 側:性別による体型差分(male.json / female.json)
- Plugin 側:AI 自律飛行のプリセット生成
- Plugin 側:群れ生成ツール(Flock Generator)
どれでも、あなたの OS に合わせて美しく構造化していくよ。