Repo ↗ · 原始 README ↗ · 文件包(Markdown/授權)

封面參考(原作): Ultrakill · 原作宣傳圖,由 IGDB 提供。圖片版權屬原權利人,供辨識原作使用,不代表此重寫/模組專案的實際畫面。

來源維護者: Gamekour · 版本: 48b65fa7abd6 · 整理日期: 2026-10-12

文件授權: MIT · LICENSE.md · 本文形式: README 翻譯

下文為來源 README 的繁中翻譯,由 Kirikirin 使用 AI 輔助整理;功能、完成度與測試結果均為原作者描述,本站未逐項實機驗證。圖片改為來源連結,指令與技術識別保留原文。


ULTRAKRUST

在 Bevy 引擎上以 Rust 非官方重實作的 ULTRAKILL。ULTRAKRUST 會在執行時直接從你自己的 ULTRAKILL 安裝讀取關卡,並以遊戲本身編譯好的著色器繪製它們。遊戲邏輯腳本是 ULTRAKILL 自身腳本的移植,因此移動、戰鬥與關卡邏輯的行為都與原作一致。

你需要在 Steam 上擁有 ULTRAKILL。 此儲存庫不含任何遊戲檔案:沒有模型、貼圖、音效、著色器或反編譯程式碼。所有內容都在執行階段從你的安裝讀取,且永不寫回。

可運作的部分

  • 0-1 關卡從頭到尾。 涵蓋空降開場、左輪手槍拾取與標題卡、每個競技場與波次、門、玻璃、風扇、檢查點與重生、Filth、Strays、Malicious Face,以及最後的深坑與結算畫面。
  • 每個戰役場景都能載入, 包含其幾何、碰撞、燈光、觸發器與關卡起始邏輯。出口電梯會載入下一關。上述以外的多數敵人與武器尚未移植。
  • V1 的移動: 行走、跳躍、衝刺、沿桿滑行、重擊、重擊跳、蹬牆跳、貼牆與超級沿桿滑行跳,採用遊戲的 125 Hz 物理步進與其調校數值。
  • 效果: 血液與血肉、環境命中粒子、沿桿滑行與牆面刮擦、HUD 與 ULTRAKILL 的後處理。
  • 自訂地圖 來自 glTF 檔案(見下文)。

尚未具備的部分

  • 武器與敵人: 只有左輪手槍與 Feedbacker。許多敵人已部分移植;頭目會生成但幾乎不做其他事,敵人投射物是佔位符,且沒有死亡動畫或布娃娃物理。
  • 音效與音樂: 無。
  • 選單、設定與難度: 無;遊戲直接開始進入關卡。
  • 遊戲手感: 沒有風格計量、定格或槍口閃光。
  • 關卡功能: 沒有秘密、骷髏、拾取物、彈跳墊、終端機、過場動畫、開場文字、Cyber Grind 或特殊關卡。
  • 已知錯誤 來自遊玩測試,列於 PARITY.md §7。

PARITY.md 有對原作的實測差距分析。MODLOG.md 記錄每項變更,並附上其背後的探測數據。

開始使用

  1. 透過 Steam 安裝 ULTRAKILL。
  2. 從 rustup.rs 安裝 Rust(stable 工具鏈)。
  3. 複製此儲存庫並執行:
cargo run --release -p ultrakrust

首次建置需要數分鐘。遊戲會自動在預設 Steam 資料夾或任何 Steam 媒體庫中找到。若找不到,請將 ULTRAKILL_DIR 指向包含 ULTRAKILL_Data 的資料夾:

ULTRAKILL_DIR="D:/Games/ULTRAKILL" cargo run --release -p ultrakrust

選項

將這些選項傳在 -- 之後,例如 cargo run --release -p ultrakrust -- --level 1-1。

旗標 作用
--level 1-1 從另一個關卡開始(預設 0-1)。
--map path/to/map.glb 載入自訂 glTF 地圖(見下文)。
--all-weapons 以所有已移植武器開始。
--sandbox 使用移動測試地圖而非關卡。
--legacy-render 使用 Bevy 自己的渲染器而非 ULTRAKILL 的著色器。
--exit-after 10 經過這麼多秒後結束。

控制

ULTRAKILL 的預設綁定:

按鍵 動作
WASD 移動
Space 跳躍
Left Shift 衝刺
Left Ctrl 沿桿滑行(在空中:地面重擊)
LMB 開火
Hold RMB 蓄力一發穿透射擊
F 出拳(也能格擋投射物)
R 從檢查點重新開始
Tab 關卡統計

額外:

按鍵 動作
N 穿牆
F3 開發者疊層
T 攝影機傾斜
[ ] 滑鼠靈敏度
Esc 釋放滑鼠

你儲存的設定與進度會從你的 ULTRAKILL 安裝讀取(唯讀)。

自訂地圖

在 Blender(或任何能匯出 glTF 的軟體)中建構地圖,將其匯出為 .glb(或 .gltf 搭配獨立的 .bin),然後執行:

cargo run --release -p ultrakrust -- --map path/to/map.glb

你會得到 V1、HUD 與關卡計時器,雙腳位於原點 (0, 0, 0),面向 −Z(Blender 的 +Y)。

碰撞 使用 Godot 的匯入名稱後綴。
將它們加到物件名稱上。它們不分大小寫,且 -x、_x 或 $x 都可行。

後綴 結果
-col 可見網格 + 精確(三角形網格)碰撞
-convcol 可見網格 + 凸包碰撞
-colonly 僅不可見碰撞。在空物件上:預設為球體(半徑 1)
-convcolonly 僅不可見凸包碰撞
-noimp 不匯入(連同其子物件)
  • 空物件上的形狀。 glTF 不儲存空物件的顯示類型。若要給 -colonly 空物件一個形狀,請加入自訂屬性 empty_display_type(匯出為 glTF extras):
    • CUBE:大小為 2 的方塊。
    • IMAGE:無限地面平面。
    • SINGLE_ARROW:射線。會跳過,因為 Unity 沒有射線碰撞器。
  • 沒有後綴的網格 是可見的,但沒有碰撞。

敵人 放在空物件上,依後綴:-filth、-stray 或 -maliciousface(例如 Guard-stray)。每一個都是 0-1 敵人的複本。它站在空物件的原點上,面向空物件的前方(Blender 的 +Y),且從一開始就在關卡中,沒有生成氣泡。目前沒有競技場或波次。

房間與門 會像戰役那樣載入與卸載地圖的一部分。將每個房間的內容放在名為 -room 的集合中(以 Full Collection Hierarchy 匯出),並將每個門口做成名為 -door 的網格(它會以其凸包碰撞)。

  • 當玩家進入距離 4 公尺內時,門會依自身高度向上滑動,並在他們身後關閉。它會連接其兩側的兩個房間(從其中間沿其最薄的水平軸向外 2 公尺處找到)。
  • 開啟門會載入其兩個房間。走進門的區域會卸載它們之外的房間。
  • 門所連接的每個房間一開始都是卸載的,除了玩家起始所在的房間。
  • 門上的自訂屬性:open(它向上滑動的公尺數)、speed(25 m/s)、start_open、locked、trigger_size(4 公尺:該區域向每側延伸多遠)以及 rooms("A, B",當找不到房間時,它依名稱連接的房間)。

東西該放哪裡。卸載的房間會隱藏其下的一切:網格、碰撞、燈光與敵人。

放在房間中 留在根層級(每個房間之外)
房間的地板、牆壁與天花板。它們也會設定房間的邊界,門與玩家起始就是藉此找到房間,因此房間需要在每個門口周圍都有幾何。 從多個房間都可見的任何東西,例如戶外背景或太陽。根層級的任何東西都會永遠載入。
只照亮該房間的燈光,因為它們會隨房間關閉。 -env 空物件。其設定會套用到整個關卡,無論它在哪裡,因此根層級是放置它的明確位置。
屬於該房間的敵人。它們會在房間載入時出現,並在卸載時消失。 -navmesh 網格。導航網格永遠是完整的,無論其網格位於何處。
房間的 -door,可選。房間中的門會將該房間算作其兩側之一;在根層級,兩側都依位置找到。無論哪種方式,門都會在地圖載入時被移出房間,因此它永遠不會卸載。
  • 玩家起始(原點)必須在某個房間的邊界內,該房間才會一開始就載入。若它不在任何房間中,每個房間都會一開始就載入(地圖會警告)。
  • 不要將幾何放在根層級且緊鄰門口,如果你希望它屬於某個房間。根層級幾何不計入任何房間,因此旁邊的門可能只找到一個房間(地圖會警告;給門一個 rooms 屬性)。
  • 不要嵌套房間。 內部房間的內容只計入內部房間,且每當其外部房間卸載時,它也會卸載。
  • 沒有門的房間 永遠不會卸載。

天空、霧與環境光: 加入一個名為 -env 的空物件(例如 Settings-env),並帶有以下任一自訂屬性。任何未包含的項目都會保留 0-1 的設定:從 0 到 250 公尺的線性霧,顏色為鏽棕色,黑色環境光,以及沒有天空盒的黑色背景。

  • skybox:依名稱指定戰役天空盒(例如 "LustSky"、"GreedSky";完整清單在 docs/MAP_FORMAT.md),或 "none"。
  • sky_color:沒有天空盒時的背景顏色。
  • fog(true/false)、fog_min 與 fog_max(公尺)、fog_color。
  • ambient_color,以及 ambient_strength,後者會乘上它。
  • 顏色是 [r, g, b] 的 0–1 值清單(Blender 顏色屬性)或十六進位字串("#843C1B"),並依原樣使用。這些設定在整個關卡中保持不變。

導航網格: 將網格命名為 -navmesh(例如 Floor-navmesh),以給敵人一個可行走的表面來尋路。它不可見且沒有碰撞。多個 -navmesh 網格會合併為一個。

  • 在其邊緣與牆壁之間留約 0.5 公尺。 該網格會依原樣使用,就像 Godot 的 -navmesh;Unity 的烘焙會替你依代理半徑(0.5 公尺)縮小它。如果邊緣沿著牆壁延伸,敵人會卡在角落。
  • 敵人只會在導航網格所在之處行走,且相連的部分必須共享頂點。
  • 沒有導航網格時,Filth 與 Strays 會直接朝玩家走,而不是繞過牆壁尋路(地圖會警告)。
  • 法線很重要。 ULTRAKILL 會剔除背面,且其表面查詢是單面的。如果地板從上方看不見,請在 Blender 中執行 Mesh → Normals → Recalculate Outside。

材質 會以 ULTRAKILL 的主著色器繪製:

  • 基礎顏色: 貼圖乘以係數。
  • 自發光: 貼圖乘以顏色,再乘以 Emission Strength。
  • 貼圖過濾: 在 Blender 中將影像設為 Closest,以獲得顆粒感的點過濾外觀。
  • 格式: PNG 與 JPEG 貼圖;內嵌或獨立檔案皆可。.gltf 中的內嵌 data: URI 不行。
  • 目前忽略: 平滑度、金屬度與頂點顏色。
  • 沒有材質: 物件會退回 0-2 電梯地板。
  • 表面: 你碰撞到的一切都會被算作金屬,用於腳步聲與命中效果。

燈光:

  • 點光、聚光與太陽光會依類型與顏色匯入。Blender 預設會將它們排除在匯出之外:在 glTF 匯出對話框中勾選 Include → Data → Punctual Lights。
  • 亮度會從 glTF 的物理單位轉換並縮小 1000 倍,以符合 Blender 的匯出(匯出的照明模式保持 Standard)。預期需要憑肉眼調校。
  • 攝影機會被忽略。

地圖專屬的 ULTRAKILL 功能(敵人、觸發器、檢查點……)尚未支援。計畫格式草擬於 docs/MAP_FORMAT.md。

給開發者

Crate 作用
crates/uk-core 與引擎無關的模擬:碰撞世界、玩家移動、攝影機、左輪手槍
crates/uk-assets 安裝的執行階段讀取器:Unity bundles、序列化檔案、網格、貼圖、材質、著色器、場景、粒子、glTF 地圖
crates/uk-game 關卡執行階段:類似 Unity 的物件模型,執行已移植的腳本、敵人、戰鬥、效果。無頭探測在 examples/
crates/uk-harness 對每個場景進行無頭一致性、回歸與效能檢查
crates/ultrakrust Bevy 前端:以 ULTRAKILL 的著色器渲染、輸入、HUD
cargo test --release --workspace
cargo run --release -p uk-harness
cargo run --release -p uk-game --example map_probe -- path/to/map.glb

測試框架只會印出失敗、回歸以及對 parity/baseline.tsv 的差距。

致謝

ULTRAKILL 為 © New Blood Interactive 與 Arsi “Hakita” Patala 所有。ULTRAKRUST 是非官方、非商業的粉絲專案,與他們無關,也未獲其背書。請購買遊戲。在 AI 協助(Claude)下建構,使用 ILSpy 與 UnityPy 檢視作者自己的遊戲複本。


授權與來源聲明

原始 README 與翻譯沿用 MIT 授權;本次修改為繁中翻譯、連結與排版調整。可修改的 Markdown、原始 README、LICENSE 與 NOTICE 收錄於頂部文件包。原作遊戲內容與商標不因此獲得授權。

LICENSE.md

MIT License

Copyright (c) [year] [fullname]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.