本篇教程由作者设定使用 CC BY-NC-SA 协议。

原文链接:For Developers

介绍

非常感谢您选择我们的 EveryXDance 模组来开发依赖项或代码级链接。让我为您介绍一下它是如何工作的,以及你可以使用什么 API 来为生物们创建动画或准备姿势。

首先,记得将 spongepowered mixin 添加到您的 build.gradle 中:

buildscript {
    repositories {
        maven { name="sponge"; url 'https://repo.spongepowered.org/repository/maven-public/' }
    }
    dependencies {
        ...
        classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
    }
}

apply plugin: 'org.spongepowered.mixin'
dependencies {
    annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
}

创建动画

推荐使用 BlockBench

如果你对选择软件感到困惑,我认为 BlockBench 是动画师们制作动画的最佳选择之一。

首先,创建一个“Minecraft 皮肤”,并选择“僵尸”模型。建议使用 Minecraft 默认的僵尸实体纹理,这样更容易设计和制作你的动画。您还可以使用骷髅、灾厄村民或任何其他模型,当然也可以使用你的模型。

【开发向】如何自定义舞蹈动作-第1张图片【开发向】如何自定义舞蹈动作-第2张图片

然后,将项目转换为模组实体。

【开发向】如何自定义舞蹈动作-第3张图片

接下来,切换到动画模式,创建一个新动画。现在请自由发挥,设计你的生物的舞蹈动画吧!建议制作1秒、2秒、4秒或8秒这样时长的动画。

【开发向】如何自定义舞蹈动作-第4张图片

制作动画后,将其导出为 .java 文件。

【开发向】如何自定义舞蹈动作-第5张图片

打开导出的文件,您可能会看到以下代码。虽然这不是添加舞蹈动画的最终代码,但它距离您的成功已经非常接近了!

【开发向】如何自定义舞蹈动作-第6张图片

如何转换代码

首先,将代码中的所有“AnimationDefinition”替换为“DanceAnimation”,删除“.looping()”,因为每个舞蹈动画都强制循环。

其次,模型部分的所有字符串类型标识符都应替换为相应的“DanceAnimation.DancePart”。例如,“头部”→“DanceAnimation.DancePart.HEAD”;“身体”→“DanceAnimation.DancePart.BODY”。

接着,将所有“new Keyframe(...)”替换为“new DanceAnimationChannel.KeyframeHolder(...)”,并将所有“new AnimationChannel(AnimationChannel.Targets.ROTATION, ...)”替换为“DanceAnimationChannel.rotation( ...)”“new AnimationChannel(AnimationChannel.Targets.POSITION, ...)”与“DanceAnimationChannel.position(...)”“new AnimationChannel(AnimationChannel.Targets.SCALE, ...)”与“DanceAnimationChannel.scale(...)”。直接使用“new Vector3f(...)”代替“KeyframeAnimations.degreeVec(...)”、 “KeyframeAnimations.posVec(...)”或“KeyframeAnimations.scaleVec(...)”——后端会自动转换它们,因此您无需担心。

最后,添加“DanceAnimationChannel.rotation(...)”“DanceAnimationChannel.position(...)”或“DanceAnimationChannel.scale(...)”函数的第一个参数。该参数指的是某个动画通道的长度(以秒为单位),并且“withLength()”的参数应该可以被每个通道的所有长度整除——因为每个通道在任何循环中都会从开始到结束循环整个动画。

完成上述步骤后,您将获得添加自己的动画的正确代码。如果我没有说清楚,请参阅原模组给出的一些预设。如果您仍然遇到问题,请在模组的 GitHub repo 中创建一个新 issue 并告诉我们您的困惑是什么。

注册动画

com.hexagram2021.everyxdance.api.client包中存放了所有的 API 类供你调用。若要注册您的动画,请从 mod-bus(不是 forge-bus)客户端事件订阅器订阅“CollectDancePresetEvent”事件,调用“event#register”来注册您自己的动画预设。

创建跳舞准备姿势

我们提供了三种舞蹈准备姿势:“HUMANOID_STAND”则像僵尸和骷髅一样站立,“HUMANOID_SIT”则像他们在矿车和船上一样坐着,“HUMANOID_CRAWL”则像猪、猫和狼一样爬行。您还可以通过以下步骤创建自己的姿势:

首先,调用“IDanceableModel.Preset.Preparation#create”来创建您自己的姿势。

其次,从 forge-bus(不是 mod-bus)客户端事件订阅器订阅“CustomPrepareDanceEvent”事件。您可以使用“if(event.getModel() instanceof XxxModel xxxModel)”之类的方法来检查哪种模型正在准备跳舞。请注意,CustomPrepareDanceEvent 在实体舞蹈期间每次跳动都会触发,因此请不要使用重复且低效的计算代码来处理事件——如果需要,请存储中间变量。

让你的生物可以跳舞

每个扩展“Mob”的生物也实现“IDanceableEntity”,因此每个生物都是可跳舞的。要启用他们的舞蹈,请参阅启用舞蹈

大多数实体模型都实现“IDanceableModel”。如果您仍然无法制作自定义怪物舞蹈,请让您的模型类“implements IDanceableModel”。您也可以使用可选 mixin 技术使 EveryXDance 成为您模组的可选依赖项,而不是必需依赖项。