Anima - 用于冒险地图和服务器的实体动画工具

Anima - 用于冒险地图和服务器的实体动画工具

用方块创建门、平台、电梯和其他移动物体——然后通过触发效果直观地控制它们!与预制体配合使用也很不错。

实用

这是什么?

Anima 是一个用于 Hytale 冒险地图和服务器的实体操控与动画框架。它允许地图制作者将实体、展示实体和选定的方块转化为可复用的动画实体组,并通过指令和触发效果进行控制。

它的主要用途是简化自动动画门、桥梁、电梯、平台、可拾取物品的传送、谜题等众多内容的创建流程。 它还能与预制件配合使用,允许实例化可移动元素,我还添加了一个触发效果用于清理它们。

我编写它是为了我自己的私人服务器,但我非常乐意与大家分享这个模组。

枯燥的部分

基本上,我将详细解释这个模组的工作原理。

Anima 实体

Anima 通过 anima:entity 组件在实体上存储动画数据。该组件追踪:

  • 一个原点姿势。
  • 命名的关键帧。
  • 最后应用的帧。
  • 供指令和触发区域使用的公开句柄。
  • 用于分组移动的父级和子级实体 UUID。
  • 活动中的动画和排队中的动画。
  • 排队的动画完成后是否循环。

Anima 实体被标记为可预制复制,因此它们可以在建造者工作流和预制件放置中存续。

原点与关键帧

原点是 Anima 实体的基础姿势。它以世界空间存储位置、旋转和缩放。

保存的关键帧存储相对于原点的运动。在运行时,Anima 会将这些相对关键帧解析回世界空间目标。这使得实体组可以作为预制件移动或放置,同时保持其动画偏移不变。

保留的关键帧名称有:

  • origin:返回捕获的原点姿势。
  • next:推进到下一个保存的关键帧,在最后一个关键帧后回绕到 origin

父子组

Anima 可以将实体分组,使一个父级驱动多个子级的移动。当父级动画时,每个子级相对于父级原点保持其偏移、旋转和缩放。

如果使用工具手动移动了分组的子实体,Anima 会更新该子实体的存储相对偏移,从而保留编辑结果。

Anima 控制器工具

此物品出现在建造者工具标签页中。当你手持它时,你将看到所有 Anima 实体及附近的关键帧名称。如果实体有句柄,你会在关键帧名称旁的括号中看到相关句柄名称。我建议避免在关键帧名称中使用空格,以免混淆。

主要操作:

  • 将目标 Anima 实体与 5 格范围内最近的空闲 Anima 实体分组。
  • 如果目标已被分组,则将其从父级分离并刷新其原点,使其重新变为独立实体。

次要操作 / 使用:

  • 打开目标实体的 Anima 实体编辑器。
  • 如果目标实体是子实体,编辑器将为根父组打开。

手持 Anima 工具时,调试视觉效果会渲染在附近的 Anima 实体周围。视觉效果显示父级和子级的边界、原点/关键帧标记、关键帧标签,以及 48 格半径内关键帧点之间的连线。

指令

根指令是 /anima

即时动画指令:

/anima easein <entity_anima_handle> <keyframe> <duration>
/anima easeout <entity_anima_handle> <keyframe> <duration>
/anima cubic <entity_anima_handle> <keyframe> <duration>
/anima linear <entity_anima_handle> <keyframe> <duration>
/anima bounce <entity_anima_handle> <keyframe> <duration>
/anima snap <entity_anima_handle> <keyframe> <duration>

这些指令会查找所有具有匹配句柄的无父级 Anima 实体,并开始向请求的关键帧播放动画。

排队动画指令:

/anima queue easein <entity_anima_handle> <keyframe> <duration>
/anima queue easeout <entity_anima_handle> <keyframe> <duration>
/anima queue cubic <entity_anima_handle> <keyframe> <duration>
/anima queue linear <entity_anima_handle> <keyframe> <duration>
/anima queue bounce <entity_anima_handle> <keyframe> <duration>
/anima queue snap <entity_anima_handle> <keyframe> <duration>
/anima queue loop <entity_anima_handle> <true|false>
/anima queue clear <entity_anima_handle>

排队动画在当前动画之后运行。如果启用了循环,队列会轮转并重复。如果禁用了循环,排队的条目将使用一次后被移除。

方块转换指令

/anima fromblocks

这将把当前建造者选区转换为分组的 Anima 方块实体。每个选定的方块都会在方块中心成为一个方块实体,离玩家最近的方块成为父级,所有其他转换的方块成为子级,原始源方块会被清除。这意味着——没错!多方块桥梁、门和平台无需太多设置即可完美同步移动!不过我不建议将其用于打开的活板门,因为命中框无法对齐,而且我也不太清楚这个问题有什么可靠的修复方法。以这种方式转换的方块遗憾地无法保留其原有功能,但理论上其他插件可以解决这个问题。

缓动模式

Anima 支持以下缓动模式:

  • linear:匀速。
  • easein:缓慢启动并加速。
  • easeout:快速启动并在接近目标时减速。
  • cubic:平滑步进插值,启动和结束时都有缓动。
  • bounce:在接近结束时添加弹跳效果。
  • snap:在持续时间内保持起始姿势,然后在结束时突然切换到目标。

触发区域效果

Anima 注册了三种触发区域效果。

Anima 动画

在 Anima 实体上运行或排队播放动画。

字段:

  • Handle:针对特定句柄。留空则针对所有 Anima 实体。
  • Ease:插值模式。
  • Keyframe:目标关键帧名称。
  • NextKeyframe:忽略 Keyframe,推进到下一个保存的关键帧。
  • Duration:动画时长(秒)。
  • Queue:将动画排队而不是立即开始。
  • LoopQueue:启用排队时,循环播放排队动画。
  • OnlyWithinVolume:仅影响当前位于触发区域内的 Anima 实体。如果使用此选项来影响区域内的所有实体,可以将 Handle 留空!

Queue 为 false 时,该效果会清除现有队列并立即开始请求的动画。

清除 Anima 实体

从实体上移除 Anima 组件。

字段:

  • Handle:清除特定句柄。留空则清除所有 Anima 实体。
  • OnlyWithinVolume:仅清除当前位于触发区域内的实体。

清除展示实体

移除类似展示功能的非玩家实体。如果实体具有模型、展示名称或边界框组件,则被视为类似展示功能的实体。

字段:

  • OnlyWithinVolume:仅清除当前位于触发区域内的类似展示功能的实体。

好的,那么如何使用它

  1. 放置或创建需要动画的实体。
  2. 使用 Anima 控制器使每个目标成为 Anima 实体并分组相关实体。如果你使用了 /anima fromblocks,可以跳过此步骤。
  3. 打开编辑器,分配句柄,并且(如果你大幅移动了实体)捕获原点。
  4. 将实体或组移动到每个所需姿势并保存命名的关键帧。
  5. 在游玩过程中使用 /anima 指令或触发区域效果来运行动画。
  6. 使用排队动画和 next 关键帧来实现循环、周期性动作、门、电梯、环境运动和分阶段效果。

如果你复制 anima 实体或在预制件中使用它,请确保在复制/保存前将其置于原点位置,因为它的位置将在粘贴时成为其新的原点!这就是你可以在预制件中使用实体的方法。

最后,AI 使用声明

核心系统和组件由我编写。也就是说,是我亲手在 IDEA 中敲的代码。 交互、UI 和触发效果的部分代码由 AI 完成。 之后我亲手修复了其中的错误和明显的问题。