# 自定义3D物品第一人称动画

在上节教程中,我们学会了如何使用微软的Attachable功能实现自定义3D物品,并使用社区工具Blockbench校正模型在第三人称的位置,最后在游戏内实装上一把自定义3D金剑。

本节课程Demo戳这里下载 (opens new window)

目前我们已经掌握:

  • 如何将一个现有的微软基岩版格式物品模型变为自定义物品的3D模型。(第一节内容)✔

  • 校对模型在模型空间的相对位置,以匹配并固定在玩家第三人称的手持位置。(第一节内容)✔

  • 借助《我的世界》基岩版电脑开发版,使用开发者工具制作模型的第一人称动画。(本节内容)❌

所以接下来将带领大家借助《我的世界》基岩版电脑开发版,使用开发者工具制作模型的第一人称动画。

img

我的世界基岩版中,第一人称和第三人称的摄像机存在空间角度区别。因此需要单独为物品模型设计第一人称的手持动画。(下图为第三人称手持正确,但在第一人称显示意外的图例)

image-20220608133313000

启动Blockbench,选择之前预制好的自定义3D物品模型,选择【动画模式】-【添加动画➕】,创建一个用于控制第一人称手持角度位置的动画,一个用于控制第一人称手持3D物品缩放的动画。(我的世界基岩版动画可以叠加,叠加后会对同一时刻下对位移、缩放、旋转的值进行加总)

image-20220608133346326

需要将动画设置为循环播放,并将动画时长长度设置为0。

在对应的第一人称手持缩放动画(以下简称"first_scale")插入一帧缩放关键帧,任意填入关键帧的缩放参数,这里我们填写XYZ为1.1并保存。

image-20220608133438507

在对应的第一人称手持位置角度动画(以下简称“first_hold”)插入一帧关键帧同时调整位置和旋转值,这里我们任意填写XYZ的位置和旋转值为3,并保存。

image-20220608133501905

接着回到附着物的定义文件,将前面的"first_hold"和"first_scale"动画进行挂载,并加入进scripts/animate根动画中。

{
    "format_version": "1.10.0",
    "minecraft:attachable": {
        "description": {
            "identifier": "design:custom_golden_sword",
            "materials": {
                "default": "entity_alphatest",
                "enchanted": "entity_alphatest_glint"
            },
            "textures": {
                "default": "textures/entity/custom_golden_sword",
                "enchanted": "textures/misc/enchanted_item_glint"
            },
            "animations": {
                "first_hold": "animation.custom_golden_sword.first_hold", //挂载自定义动画“第一人称手持”
                "first_scale": "animation.custom_golden_sword.first_scale" //挂载自定义动画“第一人称剑缩放”
            },
            "geometry": {
                "default": "geometry.custom_golden_sword"
            },
            "render_controllers": [ "controller.render.item_default" ]
        }
    }
}

再次回到《我的世界》电脑版基岩开发版,在游戏界面中按F3按键3次或14次,呼出开发者控制台。接着按下F11键呼出鼠标。

image-20220608133527259

打开Animation(动画)列表,点击Open Editor(打开编辑器)。

image-20220608133539709

默认情况下,编辑器窗口会很小。此时点击右下角的伸缩区域进行拉伸。

image-20220608133552800

拉到足够看清楚的大小后,直接往下拉到最底,这里展示着附着物挂载的动画状态。

image-20220608133606005

打开“first_hold”的Details(动画细节),再点击Bone Animation(骨骼动画),就可以看到前面用Blockbench制作的动画的各项值,并且支持直接在编辑器内动态修改,最后直观的体现在游戏内。

image-20220608133619036

这里我们对"first_hold"的position设置值为X为-8,Y为5,Z为-6。再对rotation设置X为-45,Y为15,Z为-135。对"first_scale"的scale设置为0.35。

image-20220608133639677

再按F3按键直到界面消失,就可以在游戏内看到基本合格的第一人称自定义3D物品手持效果了。

image-20220608133650381

请格外注意,在这里调整的动画并不会最终保存进动画Json文件里!因此我们还需要将值背下来,并写入动画文件中。

{
	"format_version": "1.8.0",
	"animations": {
		"animation.custom_golden_sword.first_hold": {
			"loop": true,
			"bones": {
				"sword": {
					"rotation": [-45, 15, 135],
					"position": [-8, 5, -6]
				}
			}
		},
		"animation.custom_golden_sword.first_scale": {
			"loop": true,
			"bones": {
				"sword": {
					"scale": 0.35
				}
			}
		}
	}
}

最后,对"first_hold"和"first_scale"的加载模式添加条件,使用"c.is_first_person"来判定动画是否运行在第一人称模式下,是则运行。

{
    "format_version": "1.10.0",
    "minecraft:attachable": {
        "description": {
            "identifier": "design:custom_golden_sword",
            "materials": {
                "default": "entity_alphatest",
                "enchanted": "entity_alphatest_glint"
            },
            "textures": {
                "default": "textures/entity/custom_golden_sword",
                "enchanted": "textures/misc/enchanted_item_glint"
            },
            "animations": {
                "first_hold": "animation.custom_golden_sword.first_hold", //挂载自定义动画“第一人称手持”
                "first_scale": "animation.custom_golden_sword.first_scale" //挂载自定义动画“第一人称剑缩放”
            },
            "scripts": {
                "animate": [ // 挂载动画至根动画中
                    {
                        "first_hold": "c.is_first_person" // 保证“第一人称手持”动画只在第一人称下显示
                    },
                    {
                        "first_scale": "c.is_first_person"// 保证“第一人称剑缩放”动画只在第一人称下显示
                    }
                ]
            },
            "geometry": {
                "default": "geometry.custom_golden_sword"
            },
            "render_controllers": [ "controller.render.item_default" ]
        }
    }
}

c是context的缩写,就像可以使用q来代表query一样,query是查询某个活动对象特定状态的查询函数。c.is_first_person将返回附着物是否处于第一人称视角下,在前面加上!运算符即可代表是否处于非第一人称视角,则可能是第三人称前视角或第三人称后视角下。其他的已知context函数还有:

  • **context.owning_entity:**返回附着物穿戴的实体,可以使用Molang的->运算符获取该实体身上的属性,假设已知自定义3D物品由玩家手持,则可以使用"c.owning_entity -> q.is_sneaking"返回玩家是否此时手持该附着物并下蹲。

  • **context.item_slot:**附着物手持的位置,返回"main_hand"(主手)或者"off_hand"(副手)。