Blender 新歡 Armory3D - Hello World
? 源文檔?https://github.com/Jeangowhy/opendocs/blob/main/Haxe.md
下載 Armory SDK 并解包到任意位置,然后在 Blender 安裝插件,定位到 armory.py 腳本進(jìn)行安裝。插件安裝好后,armsdk 目錄可能會(huì)被改名,注意在插件的 SDK 路徑配置中要一致。插件會(huì)在 Blender 界面頂部提供運(yùn)行、代碼編輯按鈕。
然后安裝代碼編寫工具,在 Blender 插件配置界面中設(shè)置 Armory 插件,Advanced - Code Editor 配置項(xiàng)目中指定所安裝的代碼編輯器,可以是 VSCode 或者同源的 Kcode Studio,只不過后者專用工具。還可以是 Sublime Text,或設(shè)置成系統(tǒng)默認(rèn)編輯器。
Sublime Text 安裝 Terminus 擴(kuò)展后,也可以實(shí)現(xiàn)和 VSCode 相當(dāng)?shù)募煽刂婆_(tái)的功能,可以按 Tab 或者 Console 方式打開集成命令行。為了避免重新編譯 haxe-language-server,可以使用 VSCode 擴(kuò)展中已編譯的 Haxe Language Server 腳本程序。
[Visual Studio Code](https://code.visualstudio.com/) and the
[Kha Extension pack](https://marketplace.visualstudio.com/items?itemName=kodetech.kha-extension-pack) or
[Kode Studio](https://github.com/Kode/KodeStudio/releases)
[Sublime Text](https://www.sublimetext.com/) + (optional)
[Haxe Bundle](https://packagecontrol.io/packages/Haxe) from Sublime's
[PackageControl](https://packagecontrol.io/installation)


推薦 VSCode,因?yàn)?Kha Extension Pack 集成了 LSP,包含 Haxe 開發(fā)調(diào)試工具。不過我更喜歡 Sublime Text,因?yàn)榉奖悴榭春投ㄎ辉创a!VSCode 配置中,指定 Kha 和 Krom 路徑,指向 ArmorySDK 的對(duì)應(yīng)目錄,如 C:\HaxeToolkit\armsdk\Krom 和 Kha,如果 VScode 沒有檢測(cè)到 Kha 和 Krom,則可能會(huì)自動(dòng)下載:
1. https://github.com/vshaxe/haxe-language-server
2. https://github.com/vshaxe/vshaxe/wiki/Configuration
3. https://code.visualstudio.com/api/language-extensions/language-server-extension-guide
1. Haxe - Haxe language support by Haxe Foundation
2. Debugger for Krom - Debug your JavaScript code in Krom by Kode
3. Kha - Kha support by Kode
安裝好 VSCode 擴(kuò)展,再配置項(xiàng)目,包括:構(gòu)建任務(wù)配置 task.json 和 調(diào)試器加載配置 Launch.json。先添加構(gòu)建任務(wù)配置,打開菜單 Terminal - Add Configuration ...,在備選列表中挑選適用的項(xiàng)目,比如 Windows (OpenGL) 構(gòu)建目標(biāo)。注意,安裝好 Kha 擴(kuò)展后,才會(huì)出現(xiàn)預(yù)置的構(gòu)建配置。
然后,配置調(diào)試器加載方式,一般設(shè)置 type 為 korm,也可以使用 electron 或 chrome 等類型。配置好調(diào)試器,打開 VScode 調(diào)試面板,在 Run and Debug 列表中選擇調(diào)試器的配置,然后運(yùn)行它??梢栽?preLaunchTask 指定調(diào)試之前執(zhí)行構(gòu)建任務(wù),屬性值要和任務(wù)的 label 一致:
Blender 中,Armory3D 預(yù)置提供了兩種運(yùn)行方式:Krom 和 Browser。


引擎默認(rèn)使用 Krom 作為游戲運(yùn)行時(shí),與預(yù)編譯環(huán)境相比,Krom 的設(shè)計(jì)有快速編譯時(shí)間和性能優(yōu)勢(shì)。 由 Chakra 或 V8 引擎提供 WebAssembly 字節(jié)碼運(yùn)行支持,Wasm 模塊可以同時(shí)支持 HTML5 平臺(tái), 以及主機(jī)平臺(tái) (Windows, Linux, macOS)。當(dāng)按下播放按鈕時(shí),引擎會(huì)立即與游戲一起編譯成 JS。 不需編譯 Armory,可以隨時(shí)使用內(nèi)置的更新程序用上最新的 Armory 版本。你可以修改引擎源, 每次修改都會(huì)在?Play 的時(shí)候立即生效。
Krom 公開了本機(jī)硬件功能,并在任何圖形 API 上運(yùn)行。Krom 是一個(gè)可執(zhí)行文件,Windows/Chakra 平臺(tái)上的占用空間約為 7.9MB/2.8MB(zip)。Krom 可以獨(dú)立運(yùn)行,也可以嵌入到現(xiàn)有程序中。 除了 JS 之外,WebAssembly 還可以用來包含 C/C++ 代碼。
在構(gòu)建時(shí)確保類型安全,并為運(yùn)行時(shí)錯(cuò)誤拋出堆棧跟蹤。除此之外,調(diào)試器是可用的。一旦準(zhǔn)備好發(fā)布,Krom 就可以在幾秒鐘內(nèi)部署到 Windows、Linux 和 macOS。只需修補(bǔ) krom.js 文件即更新部署的游戲。 Krom 還提供運(yùn)行時(shí)腳本功能。
如果選擇 Browser 作為運(yùn)行時(shí),則會(huì)執(zhí)行 Nodejs 運(yùn)行 Web 服務(wù)器提供服務(wù)。但是 Web 服務(wù)器 啟動(dòng)后,沒有提供關(guān)閉功能,需要關(guān)閉 Blender 文件才能關(guān)閉。
可以在渲染器屬性面板中 Armory Player 或者 Armory Project 進(jìn)行相應(yīng)操作。
在項(xiàng)目目錄下包含自動(dòng)生成的編譯配置腳本 khafile.js,和源代碼 Sources\Main.hx。默認(rèn)工程包名為 arm,用戶可以編寫自己的腳本代碼。通過渲染器屬性面板可以配置 Armory 的導(dǎo)出設(shè)置,場(chǎng)景屬性或者對(duì)象屬性面板的 Armory Traits 可以混入用戶的腳本或代碼文件。所謂 Traits 就是代碼零件,即代碼復(fù)用的一種方式,也稱為混入編程模式,被復(fù)用的代碼組件就是 Trait,有 5 種類型:
1. haXe Scripts 腳本代碼文件;
2. Nodes 使用 Logic Editor 可視化編程工具定義的節(jié)點(diǎn)樹;
3. UI - User Interface 使用 Armory2D 用戶界面編輯進(jìn)行可視化編輯;
4. Bundled Scripts 預(yù)制腳本;
5. Wasm 使用 WebAssembly 字節(jié)碼程序;
WebAssembly 字節(jié)碼文件稱為一個(gè) Module,可以使用 Rust/C/C++/Emscripten 編譯得到 WASM 文件。
以下方法可以在 Trait 構(gòu)造方法中調(diào)用以注冊(cè)事件處理函數(shù),這些也是 Trait 對(duì)象的生命周期的事件:
- `Trait.notifyOnAdd()` - trait is added to an object
- `Trait.notifyOnInit()` - object which this trait belongs to is added to scene
- `Trait.notifyOnRemove()` - object which this trait belongs to is removed from scene
- `Trait.notifyOnUpdate()` - update game logic here
- `Trait.notifyOnRender()` - update rendering here
- `Trait.notifyOnRender2D()` - update 2D rendering here
由于場(chǎng)景是異步構(gòu)建的,因此可以在尚未出現(xiàn)所有場(chǎng)景對(duì)象時(shí)調(diào)用 `onInit` 事件。如果 Trait 依賴于 其他場(chǎng)景對(duì)象,請(qǐng)使用 `Scene.active.notifyOnInit()` 事件,該事件在場(chǎng)景完全構(gòu)建后立即調(diào)用。
激活 Debug Console 可以在程序運(yùn)行時(shí)提供一個(gè)控制臺(tái)面板,顯示 *haXe.Log.trace()* 打印信息。 在渲染器屬性面板 Armory Project - Flags - Debug Console 可以設(shè)置控制臺(tái)面板,如縮放、位置。
Armory 以單個(gè) blend 文件為單位,以 Blender 場(chǎng)景為游戲的場(chǎng)景。由 Blender 生成的紋理需要先 保存為文件才可以被引用,例如 Image Texture 中創(chuàng)建紋理時(shí),Generated Type 指定生成的紋理: UV Grid 或 Color Grid,就需要先保存為文件,后續(xù)可以再打包到 blend 文件內(nèi)。在文件保存之前, 不能直接 pack 到 blend 文件內(nèi)。
Iron 框架的 Trait 腳本基本結(jié)構(gòu)參考,是不是很像寫 JavaScript,當(dāng)然 Haxe 4.3 支持的匿名函數(shù)是?()->{} 而不是 ()=>{}:
在場(chǎng)景中添加一個(gè) Plane,并且在其上面放置一個(gè) Cube,然后在物理屬性面板中啟用 Rigid Body。 并且分別設(shè)置為 Passive 模式和 Active 模式,Plane 充當(dāng)?shù)匕澹珻ube 則受重力影響,會(huì)掉落到地板。 然后,在場(chǎng)景屬性面板中,將以下代碼添加到 Armory Scene Traits 列表中,代碼通過 PhysicsWorld 檢測(cè)鼠標(biāo)點(diǎn)擊位到的物理體: