开启辅助访问      
收藏本站

站内搜索

搜索
热搜: 下载 1.21 1.20

Minecraft(我的世界)苦力怕论坛

[游戏相关] Fabric模组怎么写Inhand模型

 发表于 2026-8-14 14:53:27 | 显示全部楼层 |阅读模式 IP:上海
10铁粒
Fabric 1.19.2 Java:

我想给自己模组的物品写一个Renderer,让它能在手持的时候跟三叉戟一样显示另外的inhand模型,在gui里单独显示另一个平面的模型。但是怎么写代码一直显示的都是跟它命名空间一致的那个模型,我姑且认为代码是运行了的,而且没有报错,我但是这个代码写了和没写就没什么区别,百思不得其解,求解 5555

renderer:
@Environment(EnvType.CLIENT)
public class Renderer implements BuiltinItemRendererRegistry.DynamicItemRenderer {

    private ModelIdentifier UIModel = new ModelIdentifier(new Identifier(GuiZhen.MOD_ID, "item"), "inventory");
    private ModelIdentifier handheldModel = new ModelIdentifier(new Identifier(GuiZhen.MOD_ID, "item_inhand"), "inventory");

    private BakedModel model;

    @Override
    public void render(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {

        var bakedModelManager = MinecraftClient.getInstance().getBakedModelManager();
        var itemRenderer = MinecraftClient.getInstance().getItemRenderer();

        if (mode == ModelTransformation.Mode.GUI || mode == ModelTransformation.Mode.GROUND || mode == ModelTransformation.Mode.FIXED || mode == ModelTransformation.Mode.HEAD) {
            model = bakedModelManager.getModel(UIModel);
        } else {
            model = bakedModelManager.getModel(handheldModel);
        }

        itemRenderer.renderItem(stack, mode, false, matrices, vertexConsumers, light, overlay, model);

    }
}



实在搞不明白,json文件都是我用blockbench搭的,平面的正常继承物品的父类;手持的没有父类继承,块也没有旋转,感觉就是哪里都没有问题

苦力怕论坛,感谢有您~
回复

使用道具 举报

 发表于 2026-8-14 16:09:37 | 显示全部楼层 IP:广西
## Fabric 1.19.2 物品 Inhand 模型完整解决方案

你的代码思路是对的,但有几个关键问题需要修正。我来给你一个完整的、可以直接运行的方案。

---

### 一、问题分析

你的代码主要有以下几个问题:

1. **ModelIdentifier 构造参数错误**:Identifier 的 path 应该包含完整的模型路径
2. **缺少注册代码**:DynamicItemRenderer 需要在客户端注册
3. **JSON 模型文件结构可能有问题**

---

### 二、完整代码实现

#### 1. 主类 ModInitializer

```java
// GuiZhen.java
package yourpackage;

import net.fabricmc.api.ModInitializer;
import net.minecraft.util.Identifier;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;

public class GuiZhen implements ModInitializer {
    public static final String MOD_ID = "gui_zhen";

    public static final Item YOUR_ITEM = Registry.register(
        Registries.ITEM,
        new Identifier(MOD_ID, "your_item"),
        new Item(new Item.Settings())
    );

    @Override
    public void onInitialize() {
        // 服务端/通用初始化
    }
}
```

#### 2. 客户端初始化类(注册渲染器)

```java
// GuiZhenClient.java
package yourpackage;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry;
import net.minecraft.item.Item;

public class GuiZhenClient implements ClientModInitializer {

    @Override
    public void onInitializeClient() {
        // 注册 DynamicItemRenderer
        BuiltinItemRendererRegistry.INSTANCE.register(
            GuiZhen.YOUR_ITEM,
            new YourItemRenderer()
        );
    }
}
```

#### 3. 自定义 Renderer

```java
// YourItemRenderer.java
package yourpackage;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.ModelIdentifier;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Vec3f;

@Environment(EnvType.CLIENT)
public class YourItemRenderer implements BuiltinItemRendererRegistry.DynamicItemRenderer {

    // GUI/物品栏显示的模型
    private final ModelIdentifier UI_MODEL = new ModelIdentifier(
        new Identifier("gui_zhen", "item/your_item"),
        "inventory"
    );

    // 手持时显示的模型
    private final ModelIdentifier HANDHELD_MODEL = new ModelIdentifier(
        new Identifier("gui_zhen", "item/your_item_inhand"),
        "inventory"
    );

    private BakedModel currentModel;

    @Override
    public void render(ItemStack stack, net.minecraft.client.render.model.json.ModelTransformation.Mode mode,
                       MatrixStack matrices, VertexConsumerProvider vertexConsumers,
                       int light, int overlay) {

        MinecraftClient client = MinecraftClient.getInstance();
        BakedModelManager bakedModelManager = client.getBakedModelManager();
        ItemRenderer itemRenderer = client.getItemRenderer();

        // 根据变换模式选择使用的模型
        switch (mode) {
            case GUI:
            case GROUND:
            case FIXED:
            case HEAD:
                // 这些场景使用 GUI 模型
                currentModel = bakedModelManager.getModel(UI_MODEL);
                break;

            default:
                // 手持、第一人称、第三人称等使用手持模型
                currentModel = bakedModelManager.getModel(HANDHELD_MODEL);
                break;
        }

        // 渲染物品
        itemRenderer.renderItem(stack, mode, false, matrices,
                               vertexConsumers, light, overlay, currentModel);
    }
}
```

---

### 三、JSON 模型文件结构

#### 1. GUI 显示模型(物品栏/创造模式界面)

**文件路径**:`src/main/resources/assets/gui_zhen/models/item/your_item.json`

```json
{
    "parent": "minecraft:item/generated",
    "textures": {
        "layer0": "gui_zhen:item/your_item_texture"
    }
}
```

#### 2. 手持模型(在手中显示)

**文件路径**:`src/main/resources/assets/gui_zhen/models/item/your_item_inhand.json`

```json
{
    "parent": "minecraft:item/generated",
    "textures": {
        "layer0": "gui_zhen:item/your_item_texture"
    },
    "display": {
        "thirdperson_righthand": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "thirdperson_lefthand": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "firstperson_righthand": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "firstperson_lefthand": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "gui": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "ground": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "fixed": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        },
        "head": {
            "rotation": [0, 0, 0],
            "translation": [0, 0, 0],
            "scale": [1, 1, 1]
        }
    }
}
```

---

### 四、Texture 文件

**文件路径**:`src/main/resources/assets/gui_zhen/textures/item/your_item_texture.png`

这个是你的物品贴图,可以用 Blockbench 或 Photoshop 制作。

---

### 五、fabric.mod.json 配置

确保你的 `fabric.mod.json` 正确配置了客户端入口:

```json
{
    "schemaVersion": 1,
    "id": "gui_zhen",
    "version": "1.0.0",
    "name": "GuiZhen",
    "description": "A Fabric mod",
    "authors": ["Your Name"],

    "entrypoints": {
        "main": [
            "yourpackage.GuiZhen"
        ],
        "client": [
            "yourpackage.GuiZhenClient"
        ]
    },

    "depends": {
        "fabricloader": ">=0.14.0",
        "minecraft": "1.19.2",
        "fabric-api": "*"
    }
}
```

---

### 六、排查 checklist

如果代码还是不工作,按这个清单检查:

✅ **检查1:** ModelIdentifier 的 Identifier 路径是否正确
   - 应该是 `new Identifier("mod_id", "item/model_name")`
   - 而不是 `new Identifier("mod_id", "item")`

✅ **检查2:** JSON 文件路径是否正确
   - `src/main/resources/assets/gui_zhen/models/item/your_item.json`
   - `src/main/resources/assets/gui_zhen/models/item/your_item_inhand.json`

✅ **检查3:** 客户端初始化类是否正确注册
   - 在 `fabric.mod.json` 中配置了 `client` 入口
   - `BuiltinItemRendererRegistry.INSTANCE.register()` 被调用

✅ **检查4:** Texture 文件是否存在
   - `src/main/resources/assets/gui_zhen/textures/item/your_item_texture.png`

✅ **检查5:** 没有拼写错误
   - MOD_ID 大小写一致
   - 类名、方法名正确

---

### 七、调试技巧

如果还是不生效,可以加一些调试输出:

```java
@Override
public void render(ItemStack stack, ModelTransformation.Mode mode,
                   MatrixStack matrices, VertexConsumerProvider vertexConsumers,
                   int light, int overlay) {

    // 调试输出
    System.out.println("Rendering item, mode: " + mode);
    System.out.println("UI_MODEL: " + UI_MODEL);
    System.out.println("HANDHELD_MODEL: " + HANDHELD_MODEL);

    BakedModelManager bakedModelManager = MinecraftClient.getInstance().getBakedModelManager();

    // 检查模型是否加载成功
    System.out.println("UI model exists: " + bakedModelManager.getModel(UI_MODEL));
    System.out.println("Handheld model exists: " + bakedModelManager.getModel(HANDHELD_MODEL));

    // ... 其余代码
}
```

---

### 八、总结

关键修改点:

1. **ModelIdentifier 构造函数**:`new ModelIdentifier(new Identifier("mod_id", "item/model_name"), "inventory")`
2. **注册位置**:在 ClientModInitializer 中注册
3. **JSON 路径**:确保在正确的资源路径下创建模型文件

按照这个方案修改后应该就能工作了!祝好运~我很需要那10个铁粒!

2# 2026-8-14 16:09:37 回复 收起回复
苦力怕论坛,感谢有您~
回复

使用道具 举报

 发表于 2026-8-14 16:17:03 | 显示全部楼层 IP:广西
你好小绎 发表于 2026-8-14 16:09
## Fabric 1.19.2 物品 Inhand 模型完整解决方案

你的代码思路是对的,但有几个关键问题需要修正。我来给 ...

求求给我点铁粒吧~

评分

参与人数 1铁粒 +1 收起 理由
 k*** + 1 我要这铁粒有何用

查看全部评分

3# 2026-8-14 16:17:03 回复 收起回复
苦力怕论坛,感谢有您~
回复

使用道具 举报

 发表于 2026-8-15 15:29:43  来自手机 | 显示全部楼层 IP:广东省
你好小绎 发表于 2026-8-14 16:09
## Fabric 1.19.2 物品 Inhand 模型完整解决方案

你的代码思路是对的,但有几个关键问题需要修正。我来给 ...

怎么有股AI味
4# 2026-8-15 15:29:43 回复 收起回复
苦力怕论坛,感谢有您~
回复

使用道具 举报

 发表于 2026-8-15 19:23:19 | 显示全部楼层 IP:广西

我给AI表达了我自己对代码的看法和点评,让他把话语串联起来,我再发出去
5# 2026-8-15 19:23:19 回复 收起回复
苦力怕论坛,感谢有您~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

木韩网络 提供支持 | GMT+8, 2026-9-12 13:28

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4