Files
netease-modsdk-wiki/docs/mcguide/20-玩法开发/15-自定义游戏内容/1-自定义物品/9-自定义3D物品/2-自定义3D物品(二).md
2025-03-17 13:24:39 +08:00

195 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自定义3D物品第一人称动画
在上节教程中我们学会了如何使用微软的Attachable功能实现自定义3D物品并使用社区工具Blockbench校正模型在第三人称的位置最后在游戏内实装上一把自定义3D金剑。
**本节课程Demo[戳这里下载](https://g79.gdl.netease.com/CustomWeapon3D.zip)**
**目前我们已经掌握:**
- 如何将一个现有的微软基岩版格式物品模型变为自定义物品的3D模型。第一节内容
- 校对模型在模型空间的相对位置,以匹配并固定在玩家第三人称的手持位置。(第一节内容)✔
- 借助《我的世界》基岩版电脑开发版,使用开发者工具制作模型的第一人称动画。(本节内容)❌
所以接下来将带领大家借助《我的世界》基岩版电脑开发版,使用开发者工具制作模型的第一人称动画。
![img](./images/0_0.png)
我的世界基岩版中,第一人称和第三人称的摄像机存在空间角度区别。因此需要单独为物品模型设计第一人称的手持动画。(下图为第三人称手持正确,但在第一人称显示意外的图例)
<img src="./images/0_1.png" alt="image-20220608133313000" style="zoom:150%;" />
启动Blockbench选择之前预制好的自定义3D物品模型选择【动画模式】-【添加动画创建一个用于控制第一人称手持角度位置的动画一个用于控制第一人称手持3D物品缩放的动画。我的世界基岩版动画可以叠加叠加后会对同一时刻下对位移、缩放、旋转的值进行加总
![image-20220608133346326](./images/0_2.png)
需要将动画设置为循环播放并将动画时长长度设置为0。
在对应的第一人称手持缩放动画(以下简称"first_scale"插入一帧缩放关键帧任意填入关键帧的缩放参数这里我们填写XYZ为1.1并保存。
![image-20220608133438507](./images/0_3.png)
在对应的第一人称手持位置角度动画以下简称“first_hold”插入一帧关键帧同时调整位置和旋转值这里我们任意填写XYZ的位置和旋转值为3并保存。
![image-20220608133501905](./images/0_4.png)
接着回到附着物的定义文件,将前面的"first_hold"和"first_scale"动画进行挂载并加入进scripts/animate根动画中。
```json
{
"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](./images/0_11.png)
打开Animation动画列表点击Open Editor打开编辑器
![image-20220608133539709](./images/0_10.png)
默认情况下,编辑器窗口会很小。此时点击右下角的伸缩区域进行拉伸。
![image-20220608133552800](./images/0_9.png)
拉到足够看清楚的大小后,直接往下拉到最底,这里展示着附着物挂载的动画状态。
![image-20220608133606005](./images/0_8.png)
打开“first_hold”的Details动画细节再点击Bone Animation骨骼动画就可以看到前面用Blockbench制作的动画的各项值并且支持直接在编辑器内动态修改最后直观的体现在游戏内。
<img src="./images/0_7.png" alt="image-20220608133619036" style="zoom:150%;" />
这里我们对"first_hold"的position设置值为X为-8Y为5Z为-6。再对rotation设置X为-45Y为15Z为-135。对"first_scale"的scale设置为0.35。
![image-20220608133639677](./images/0_6.png)
再按F3按键直到界面消失就可以在游戏内看到基本合格的第一人称自定义3D物品手持效果了。
![image-20220608133650381](./images/0_5.png)
请格外注意在这里调整的动画并不会最终保存进动画Json文件里因此我们还需要将值背下来并写入动画文件中。
```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"来判定动画是否运行在第一人称模式下,是则运行。
```json
{
"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"(副手)。