Blender 新欢 Armory3D - Hello World
✨ 源文档 https://github.com/Jeangowhy/opendocs/blob/main/Haxe.md
下载 Armory SDK 并解包到任意位置,然后在 Blender 安装插件,定位到 armory.py 脚本进行安装。插件安装好后,armsdk 目录可能会被改名,注意在插件的 SDK 路径配置中要一致。插件会在 Blender 界面顶部提供运行、代码编辑按钮。
然后安装代码编写工具,在 Blender 插件配置界面中设置 Armory 插件,Advanced - Code Editor 配置项目中指定所安装的代码编辑器,可以是 VSCode 或者同源的 Kcode Studio,只不过后者专用工具。还可以是 Sublime Text,或设置成系统默认编辑器。
Sublime Text 安装 Terminus 扩展后,也可以实现和 VSCode 相当的集成控制台的功能,可以按 Tab 或者 Console 方式打开集成命令行。为了避免重新编译 haxe-language-server,可以使用 VSCode 扩展中已编译的 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,因为 Kha Extension Pack 集成了 LSP,包含 Haxe 开发调试工具。不过我更喜欢 Sublime Text,因为方便查看和定位源代码!VSCode 配置中,指定 Kha 和 Krom 路径,指向 ArmorySDK 的对应目录,如 C:\HaxeToolkit\armsdk\Krom 和 Kha,如果 VScode 没有检测到 Kha 和 Krom,则可能会自动下载:
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 扩展,再配置项目,包括:构建任务配置 task.json 和 调试器加载配置 Launch.json。先添加构建任务配置,打开菜单 Terminal - Add Configuration ...,在备选列表中挑选适用的项目,比如 Windows (OpenGL) 构建目标。注意,安装好 Kha 扩展后,才会出现预置的构建配置。
然后,配置调试器加载方式,一般设置 type 为 korm,也可以使用 electron 或 chrome 等类型。配置好调试器,打开 VScode 调试面板,在 Run and Debug 列表中选择调试器的配置,然后运行它。可以在 preLaunchTask 指定调试之前执行构建任务,属性值要和任务的 label 一致:
Blender 中,Armory3D 预置提供了两种运行方式:Krom 和 Browser。


引擎默认使用 Krom 作为游戏运行时,与预编译环境相比,Krom 的设计有快速编译时间和性能优势。 由 Chakra 或 V8 引擎提供 WebAssembly 字节码运行支持,Wasm 模块可以同时支持 HTML5 平台, 以及主机平台 (Windows, Linux, macOS)。当按下播放按钮时,引擎会立即与游戏一起编译成 JS。 不需编译 Armory,可以随时使用内置的更新程序用上最新的 Armory 版本。你可以修改引擎源, 每次修改都会在 Play 的时候立即生效。
Krom 公开了本机硬件功能,并在任何图形 API 上运行。Krom 是一个可执行文件,Windows/Chakra 平台上的占用空间约为 7.9MB/2.8MB(zip)。Krom 可以独立运行,也可以嵌入到现有程序中。 除了 JS 之外,WebAssembly 还可以用来包含 C/C++ 代码。
在构建时确保类型安全,并为运行时错误抛出堆栈跟踪。除此之外,调试器是可用的。一旦准备好发布,Krom 就可以在几秒钟内部署到 Windows、Linux 和 macOS。只需修补 krom.js 文件即更新部署的游戏。 Krom 还提供运行时脚本功能。
如果选择 Browser 作为运行时,则会执行 Nodejs 运行 Web 服务器提供服务。但是 Web 服务器 启动后,没有提供关闭功能,需要关闭 Blender 文件才能关闭。
可以在渲染器属性面板中 Armory Player 或者 Armory Project 进行相应操作。
在项目目录下包含自动生成的编译配置脚本 khafile.js,和源代码 Sources\Main.hx。默认工程包名为 arm,用户可以编写自己的脚本代码。通过渲染器属性面板可以配置 Armory 的导出设置,场景属性或者对象属性面板的 Armory Traits 可以混入用户的脚本或代码文件。所谓 Traits 就是代码零件,即代码复用的一种方式,也称为混入编程模式,被复用的代码组件就是 Trait,有 5 种类型:
1. haXe Scripts 脚本代码文件;
2. Nodes 使用 Logic Editor 可视化编程工具定义的节点树;
3. UI - User Interface 使用 Armory2D 用户界面编辑进行可视化编辑;
4. Bundled Scripts 预制脚本;
5. Wasm 使用 WebAssembly 字节码程序;
WebAssembly 字节码文件称为一个 Module,可以使用 Rust/C/C++/Emscripten 编译得到 WASM 文件。
以下方法可以在 Trait 构造方法中调用以注册事件处理函数,这些也是 Trait 对象的生命周期的事件:
- `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
由于场景是异步构建的,因此可以在尚未出现所有场景对象时调用 `onInit` 事件。如果 Trait 依赖于 其他场景对象,请使用 `Scene.active.notifyOnInit()` 事件,该事件在场景完全构建后立即调用。
激活 Debug Console 可以在程序运行时提供一个控制台面板,显示 *haXe.Log.trace()* 打印信息。 在渲染器属性面板 Armory Project - Flags - Debug Console 可以设置控制台面板,如缩放、位置。
Armory 以单个 blend 文件为单位,以 Blender 场景为游戏的场景。由 Blender 生成的纹理需要先 保存为文件才可以被引用,例如 Image Texture 中创建纹理时,Generated Type 指定生成的纹理: UV Grid 或 Color Grid,就需要先保存为文件,后续可以再打包到 blend 文件内。在文件保存之前, 不能直接 pack 到 blend 文件内。
Iron 框架的 Trait 脚本基本结构参考,是不是很像写 JavaScript,当然 Haxe 4.3 支持的匿名函数是 ()->{} 而不是 ()=>{}:
在场景中添加一个 Plane,并且在其上面放置一个 Cube,然后在物理属性面板中启用 Rigid Body。 并且分别设置为 Passive 模式和 Active 模式,Plane 充当地板,Cube 则受重力影响,会掉落到地板。 然后,在场景属性面板中,将以下代码添加到 Armory Scene Traits 列表中,代码通过 PhysicsWorld 检测鼠标点击位到的物理体: