UID2309916
性别保密
经验 EP
铁粒 粒
回帖0
主题
精华
在线时间 小时
注册时间2026-8-10
最后登录1970-1-1
|
发表于 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
回复(0)
收起回复
|