Community程式設計與開發github.com

ali-ali18/agent-skills

在 VM 內使用 Rojo 以 Luau 語言開發 Roblox 遊戲,並透過 Open Cloud 將建置結果發佈至使用者指定的測試場所。

agent-skills 是什麼?

此技能讓 AI 助手能在虛擬機(VM)環境中,使用 Rojo(v7.7.1)與 Luau 語言進行 Roblox 遊戲開發。流程包括:以純文字檔案形式在 VM 中建立專案(遵循標準目錄結構與編碼慣例)、使用 `rojo build` 編譯成單一的 `place.rbxl` 檔案,以及透過 Roblox Open Cloud API 將該檔案上傳至使用者提供的**測試場所**(universeId + placeId)。此技能專為測試與迭代設計,不會在未經明確許可的情況下發佈至正式環境,並內建嚴格的安全機制,例如使用金鑰保管庫(vault)處理 API 金鑰、強制對 Remote 事件進行類型與權限驗證,以及限制客戶端的信任範圍。支援 Linux x86_64 與 aarch64 環境,所有操作皆在 VM 內完成,不依賴 Roblox Studio 進行同步。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ali-ali18/agent-skills/tree/HEAD/skills/roblox

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

使用 Rojo (Luau) 進行 Roblox 開發

您在 VM 內以純文字檔案建構 Roblox 體驗,使用 Rojo 將其編譯成場所文件,並僅在使用者要求時,透過 Roblox Open Cloud 將該文件上傳至測試場所。請以使用者的語言回覆(預設為 pt-BR)。

0. 基本規則

  • 切勿列印、顯示、記錄或寫出任何 API 金鑰。僅可在 shell 呼叫中使用保管庫標記 {{secret:<名稱>}};執行時會自動替換該值並隱藏輸出。
  • 僅發佈至使用者提供的測試場所(universeId + placeId)。切勿猜測 ID,也切勿重複使用其他對話的 ID。如果使用者提供的是正式/生產環境的場所,請停止並確認是否故意為之。
  • 預設 versionType 為 Saved(版本歷史中的新版本,而非即時生效)。僅在使用者明確要求上線時才使用 Published。
  • 缺少 universeId、placeId 或 secret 名稱?使用 propose_questionnaire 提問(一個簡短表單)。完全缺少 secret?呼叫 secret_request(建議名稱:ROBLOX_API_KEY)。切勿在聊天中詢問金鑰。

1. 安裝 Rojo(每個 VM 一次)

固定版本:Rojo 7.7.1(請查看 https://github.com/rojo-rbx/rojo/releases 是否有更新的 7.x 版本,並在更改固定版本前告知使用者)。將預編譯的 Linux x86_64 二進位檔安裝到家目錄,無需 root 權限:

mkdir -p "$HOME/.local/bin" && cd "$(mktemp -d)"
curl -fsSL -o rojo.zip https://github.com/rojo-rbx/rojo/releases/download/v7.7.1/rojo-7.7.1-linux-x86_64.zip
unzip -o rojo.zip && install -m 0755 rojo "$HOME/.local/bin/rojo"
export PATH="$HOME/.local/bin:$PATH"
rojo --version   # 預期:rojo 7.7.1

先使用 command -v rojo 檢查;如果已安裝 7.x 版本則跳過安裝。在 ARM VM 上使用 linux-aarch64 資源。如果已有工具鏈管理器,則替代方案為:rokit add rojo-rbx/rojo && rokit install。請勿從任何其他 URL 執行安裝程式。

2. 專案結構

my-game/
  default.project.json
  src/
    server/     -> ServerScriptService.Server   (僅伺服器端程式碼)
    client/     -> StarterPlayer.StarterPlayerScripts.Client
    shared/     -> ReplicatedStorage.Shared      (雙方皆可 require 的模組)

default.project.json:

{
  "name": "my-game",
  "tree": {
    "$className": "DataModel",
    "ServerScriptService": { "Server": { "$path": "src/server" } },
    "ReplicatedStorage": { "Shared": { "$path": "src/shared" } },
    "StarterPlayer": {
      "$className": "StarterPlayer",
      "StarterPlayerScripts": { "Client": { "$path": "src/client" } }
    }
  }
}

Rojo 能識別的檔案命名規則:init.server.luau(資料夾的 Script)、*.server.luau(Script)、*.client.luau(LocalScript)、純 *.luau(ModuleScript)、init.luau(資料夾變為 ModuleScript)。新增一個包含 *.rbxl、*.rbxlx、Packages/ 的 .gitignore。僅在資料夾尚無 default.project.json 時建立專案;切勿覆寫現有結構,應適應它。

3. 編碼規範

  • 每個檔案頂部加上 --!strict。為函式簽名和匯出的 table 標註類型。
  • 每個 ModuleScript 僅負責一個職責,並回傳一個 table。不使用全域變數、_G 或 shared。使用 require 並以直接參考的方式(script.Parent.Module 或 ReplicatedStorage.Shared.Module)。
  • 保持進入點極簡:一個 init.server.luau 和一個客戶端進入點,它們依序 require 服務/控制器並啟動。
  • 在頂部取得服務:local Players = game:GetService("Players")。優先使用 task.wait、task.spawn、task.delay 而非 wait/spawn/delay。在 Players.PlayerRemoving 時斷開每個玩家的連線。
  • 切勿信任客戶端。伺服器擁有遊戲狀態(金錢、背包、傷害、傳送、進度)。客戶端僅發送意圖並呈現結果。

Remote 安全檢查清單

  • 在伺服器端於 ReplicatedStorage 下建立 RemoteEvent/RemoteFunction 實例,並使用固定名稱;切勿從客戶端建立。
  • 對於每個 OnServerEvent/OnServerInvoke:驗證參數數量和類型(typeof)、限制範圍、拒絕 NaN/inf、限制字串長度、檢查玩家是否允許(冷卻、擁有權、距離、存活狀態)。
  • 對每個玩家進行速率限制(token bucket 或最後呼叫時間戳記)。Remote 絕不能攜帶價格、傷害數值或任何客戶端可藉以獲利的數值。
  • RemoteFunction:切勿 InvokeClient(惡意客戶端可能導致伺服器執行緒掛起)。
  • DataStore:使用 pcall 包裝、搭配退避重試、在 PlayerRemoving 和 game:BindToClose 時儲存;對有價值的資料進行 session-lock。
  • 機密和調整參數僅存在於 ServerScriptService/ServerStorage 中,絕不可放在 ReplicatedStorage。

4. 建置

rojo build default.project.json -o place.rbxl
ls -l place.rbxl

首先修復建置錯誤(缺少 $path、JSON 格式錯誤、重複名稱)。請勿提交 place.rbxl。selene / stylua --check 為可選項;除非使用者要求,否則不要安裝它們。從文件建置的場所僅為腳本骨架:在 Studio 中建立的素材、地形和 UI 存在於現有場所中,因此上傳會取代目標版本的內容。這正是目標必須是測試場所的原因。

5. 透過 Open Cloud 發佈(測試場所)

端點(Roblox Open Cloud Place Publishing,universes v1):

POST https://apis.roblox.com/universes/v1/{universeId}/places/{placeId}/versions?versionType=Saved|Published

  • Header:x-api-key: <key>;對於 .rbxl(二進位)使用 Content-Type: application/octet-stream,對於 .rbxlx 使用 application/xml。
  • Body:原始的場所文件。成功回應:{ "versionNumber": 7 }。
  • API 金鑰需要在目標體驗上具有 universe-places 權限的「寫入」權限(在 Creator Dashboard 中建立)。
  • 僅限 HTTPS。該 API 無法更新某些實例類型(EditableImage, EditableMesh, PartOperation, SurfaceAppearance, BaseWrap):告知使用者需從 Studio 發佈這些項目。
  • 文件:https://create.roblox.com/docs/en-us/cloud/guides/usage-place-publishing

使用保管庫標記執行(標記放在 shell 命令內,切勿放在您的訊息文字中):

curl -sS -X POST \
  "https://apis.roblox.com/universes/v1/$UNIVERSE_ID/places/$PLACE_ID/versions?versionType=Saved" \
  -H "x-api-key: {{secret:ROBLOX_API_KEY}}" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @place.rbxl

將 $UNIVERSE_ID 和 $PLACE_ID 替換為使用者提供的數字,並將 secret 名稱替換為實際的保管庫名稱(secret_list 僅顯示名稱)。處理錯誤時不得暴露金鑰:401/403 = 金鑰無效或缺少權限/體驗;404 = 錯誤的 universe/place 組合;400 = 檔案錯誤(重新建置);429 = 等待並重試一次。僅提及 HTTP 狀態碼和回應內容,回應內容絕不含金鑰。

6. 回報

每個任務結束時,以使用者的語言提供簡短回報:

  1. 變更了什麼(檔案和行為),以簡單明瞭的文字說明。
  2. rojo build 的結果,以及如果已發佈,則提供 versionNumber、所使用的 versionType,並說明已發佈至測試場所 <placeId>。
  3. 如何在 Studio 中測試:開啟測試場所,開啟版本歷史以載入新的 Saved 版本,按下播放 (F5),以及確切應嘗試的事項與預期的 Output 訊息。
  4. 您未做的事(即時發佈、需要 Studio 的素材或地形)。

7. 本地同步選項

若需即時編輯,使用者可在自己的電腦上執行 rojo serve 並搭配 Rojo Studio 外掛 (https://rojo.space/docs/v7/getting-started/installation/)。VM 無法從他們的 Studio 存取,因此在 VM 內請維持使用建置後再透過 Open Cloud 上傳的方式。

相關技能