使用 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. 回報
每個任務結束時,以使用者的語言提供簡短回報:
- 變更了什麼(檔案和行為),以簡單明瞭的文字說明。
rojo build的結果,以及如果已發佈,則提供versionNumber、所使用的versionType,並說明已發佈至測試場所<placeId>。- 如何在 Studio 中測試:開啟測試場所,開啟版本歷史以載入新的 Saved 版本,按下播放 (F5),以及確切應嘗試的事項與預期的 Output 訊息。
- 您未做的事(即時發佈、需要 Studio 的素材或地形)。
7. 本地同步選項
若需即時編輯,使用者可在自己的電腦上執行 rojo serve 並搭配 Rojo Studio 外掛 (https://rojo.space/docs/v7/getting-started/installation/)。VM 無法從他們的 Studio 存取,因此在 VM 內請維持使用建置後再透過 Open Cloud 上傳的方式。