欢迎光临散文网 会员登陆 & 注册

Blender 新欢 Armory3D - Armory Addon + Bundled Trait

2023-04-14 14:53 作者:紧果呗  | 我要投稿

Armory Engine 集成了 Kha 构建工具,而另一方面提供 Armory 插件扩充了 Blender 功能,根据 Blender 中的设置来生成相应的脚本、代码文件,再调用 Kha 构建工具编译程序。


Iron 构建则是基于更高级的抽象,为游戏开发提供了套基于场景节点层次结构的框架,提供多种 Traits 抽象类型,用于扩展 Blender 场景中各种对象的程序化操作。


Armory 编译运行出现黑窗口时,通常 Clean 掉编译缓存文件后,再重新编译即可以解决问题。


Armory 是一个完全免费免版税开放源代码游戏引擎。Blender BEG 游戏引擎则受到 GNU GPL 许可证约束。

# ✨ 源文档 https://github.com/Jeangowhy/opendocs/blob/main/Haxe.md

Armory Engine 以单个 .blend 文件为基本的程序组织形式,每个 .blend 的场景就是游戏中的场景。Kha 构建脚本 khafile.js 的内容根据 Blender 的各种设置来生成。


另外,**Project Root** 设置可以 .blend 文件位于项目子目录下的情况下使用,这个配置项专用于指定 .blend 文件位置:`Render Properties > Armory Project > Modules > Root`,此路径会决定 Haxe traits 类型定义文件的定位,以及自动生成文件的存放位置。


注意,如果设置 Root 属性,那么可能导致资源定位不正确。


比如,设置 MyRoot 作为根据目录,但是 .blend 文件还在项目的根目录,那么在使用纹理贴图时,文件路径就相对于 Root 指定的根目录,但是 Blender 还是使用相对于文件所在的目录。Blender 使用 // 表示 .blend 文件所在目录。


这种设置就会在 Armory 引擎产生错误的处理逻辑:


- `//` 项目根目录下的纹理文件就会变成指向 //MyRoot 目录下的纹理;

- `//MyRoot` 目录下的纹理贴图的路径就会变成指定 //MyRoot/MyRoot 目录下的文件,


Armory 提供了 Multi-User Workflow 支持,但是还在完善中。多人开发工作流基于 Blender 的链接功能,可以将大型的 .blend 分解成更小的多个 .blend 文件。通过使用**Library Overrides**功能,可以使用数据覆盖实现修改原本不可以修改的链接数据块,需要启用 `Edit Linked Library` 插件。


虽然可以使用 Blender 的资源导入功能,将多个 .blend 内容链接到当前场景或 .blend 工程内:

  • 1. `File - Import` to import file formats.

  • 2. `File - Append` to import objects from other .blend files.

  • 3. `File - Link` to link objects from other .blend files.

Blender 链接外部文件扩充场景内容后,Armory 不能很好处理,会导致程序黑屏运行。


Armory 无法和诸如 UE4 或 Unity 等商业游戏引擎相比,原生优化效果非常差,同样的模型导入 UE4, 运行起来很流畅,到了 Armory 这里就可能无法运行。UE4 和 Unity 都支持实时编辑调试材质,Armory 还不行,没并完全支持 Blender 材质节点,做好一个材质,运行效果会有出入。效果不行就需要再调整, 调整好了再运行测试,这段编译的时间还很长,就这么浪费掉了。当然其它引擎做材质也要编译,但是基本 可以实时预览。


Armory 使用 Bullet 物理引擎的 Haxe 移植版 haxebullet,ArmorySDK 已经包含这个开源物理引擎。 Scene 属性面板中是否勾选激活 Rigid Body World 不影响 Armory 模拟破碎效果,只影响 Blender。 Armory 默认使用 Bullet 模拟所有对象的运动,特性如下,备选物理引擎是 Oimo physics engine:

  • 01. Notable Features:

  • 02. Rigid body simulation

  • 03. Soft body simulation

  • 04. Ragdoll simulation

  • 05. Ray casting

  • 06. Collision groups

  • 07. Simulation of breaking / fractured meshes

Trait Types & Events

在项目目录下包含自动生成的编译配置脚本 khafile.js,和源代码 Sources\Main.hx。默认工程包 名为 arm,用户可以编写自己的脚本代码。通过渲染器属性面板可以配置 Armory 的导出设置,场景属性 或者对象属性面板的 Armory Traits 可以混入用户的脚本或代码文件。所谓 Traits 就是代码零件, 即代码复用的一种方式,也称为混入编程模式,被复用的代码组件就是 Trait,有 5 种类型,本文着重介绍其中之一:


1. **haXe** 脚本代码文件;

2. **Nodes** 使用 Logic Node Editor 可视化编程工具定义的节点树;

3. **UI** - User Interface (Canvas trait),使用 Armory2D 用户界面编辑进行可视化编辑;

4. **Bundled** Armory Engine 预定义 Haxe 脚本,是 `Trait` 类型的扩展;

5. **Wasm** 使用 WebAssembly 字节码程序;


以下方法可以在 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()` 事件,该事件在场景完全构建后立即调用。


Bundled Scripts

所谓“捆绑脚本”,Bundled Scripts,就是 Armory 源代码中现有的由 Haxe 编写的 Trait 扩展类型。与常规 Haxe 脚本类似,Bundled 脚本可以附加到对象属性面板或场景属性中的 Armory Trait 列表中。


例如,使用 PhysicsDrag 特性,当这个特性附加到启用了物理的对象上时,可以使用鼠标拖动这个对象。


又如,使用 WalkNavigation 可以实现相机的漫步运动控制,打开相机对象属性面板,Armory Traits 列表中添加一个 Bunddled,然后在 class 列表中指定需要使用的 Armory 内置的 `Trait` 扩展,选择 `WalkNavigation` 类型以控制相机运动,如果当前对象不是相机,那么运行时控制台就会输出初始化函数执行类型转换失败的信息:


添加相应的 Bundled 扩展后,点击 Edit Source 编辑脚本,Armory Engine 中相应的源代码文件就会复制到工程的 Sources 目录下,这个编辑操作会将内置的 Bundled 转换为 Haxe Script。


执行构建,khafile.js 构建脚本中就会自动添加相应的参数:

构建脚本中经常使用 `addParameter()` 告诉 Haxe 编译时调用 macro 函数。Haxe 初始化宏是一种在命令行中调用宏的方式,[Initialization Macros] 命令行格式 `--macro callExpr(args)`。它用来向编译器注册一个函数,使其在宏上下文创建后得到调用,比如,keep() 就是一个宏初始化调用。宏初始化必需在 `--main` 参数之前指定。


如果 `--macro` 调用的是一个 plain identifier,就会在 Haxe Standard Library 中的

`haxe.macro.Compiler` 内定位这个标识,这里定义多个非常有用的初始化宏:


由于所有宏共享相同的 [Macro Context],初始化宏可以设置其他宏用作配置的静态字段的值。


1. `Compiler.include` Includes all modules in package `pack` in the compilation.

2. `Compiler.keep` Marks types or packages to be kept by DCE (Dead Code Elimination).


Armory 的游戏角色导航功能使用 [Recast navigation] 框架,Blender 渲染属性面板中可以启用它:`Armory Project - Modules - Navigation`。导航网格与内置的 Bundled Trait 配合使用:

    armory.trait.NavMesh

    armory.trait.NavAgent

    armory.trait.NavCrowd

在对象的 Armory Traits 列表中添加 Bundled - Navmesh。

官方提供 Armory Tutorials: Navmesh 和 Navmesh Follow 两示例。

  •   * [Navmesh](https://github.com/armory3d/armory/wiki/navmesh)

  •   * [Terrain](https://github.com/armory3d/armory/wiki/terrain)

  •   * [Recast navigation](https://github.com/armory3d/haxerecast)

  •   * Navmesh Examples https://github.com/armory3d/armory_examples/tree/master/navmesh

以下一是 Armsdk 中定义的 Bundled Scripts 列表:



Blender 新欢 Armory3D - Armory Addon + Bundled Trait的评论 (共 条)

分享到微博请遵守国家法律