本篇教程由作者设定未经允许禁止转载。

“在较早期的版本中(比如1.7.10),模型就是直接在代码里生成的。

但这样不仅不易修改,还容易出问题。直到后来Minecraft引入了模型

文件的概念,这一个问题被解决了,在代码中生成模型的日子也成为历史了。”


(注:该教程使用Mojang官方映射,如果你使用的是Yarn映射,请使用映射翻译器进行转换)

总所周知,Minecraft的模型一般都是放在资源包中加载的,大部分Mod也是如此。

但是,当物品数量过多,外置的Json模型太占空间了怎么办?


你可以考虑——内置模型。

不过一般情况下不推荐这么做,因为就如同引文所说的“不易修改”。

但如果你拥有像格雷科技那样庞大的材料数量,那这就是最好的方案了。


根据Fabric API给出的接口,我们可以用如下的方式在加载一个模型的时候替换原先本该加载的模型:

public class ModelLoader implements ModelVariantProvider{
    @Override
    public @Nullable UnbakedModel loadModelVariant(ModelResourceLocation modelId, ModelProviderContext context)
            throws ModelProviderException {
        // 返回一个模型或者留空(加载原先的模型)
        return null;
    }
}

如果你尝试按照Fabric Wiki上的实现来做,

那请立即删除你复制下来的代码,因为这个教程用不到那些烦人复杂的实现。绕了半天结果又回到原点,还是什么都不会做()


因为我们知道Minecraft是从资源包中加载Json模型文件来加载模型的,那必定会有用于解码Json模型文件的方法。

根据反编译出来的代码我们就可以一探究竟。

试着调用BlockModel.fromString方法:

public class ModelLoader implements ModelVariantProvider{
    @Override
    public @Nullable UnbakedModel loadModelVariant(ModelResourceLocation modelId, ModelProviderContext context)
            throws ModelProviderException {
        // 请把此处的"modid:item"替换成一个物品的注册名。
        if(modelId.toString().equals("modid:item#inventory")){
            // 将内容替换成Json模型文件的内容,请删除所有的换行符并给双引号加上"\"转义,
            // 或者使用"""多行字符串"""(用三个双引号括起来)。
            return BlockModel.fromString("<Json模型文件内容>")
        }
        return null;
    }
}

然后启动游戏,我们就可以看到被正常渲染的物品:

加载内置模型,告别低效外部模型-第1张图片

没错,内置模型的实现就是如此简单。

虽然这种方法或许较为低效且不易于拓展,但对于有迫切需求且能力的人来说,这是最快速的解决方法。

当时我也绕了半天(),结果就是搞不明白,现在这种方法大概是最快的了。


(另请参阅:Fabric Wiki