如何通过net.minecraft.client.font.TextRenderer修改模组菜单按钮文字大小?
问题核心
直接全局修改MatrixStack缩放会牵连按钮的碰撞盒、背景渲染等所有元素,导致画面错乱;且错误的矩阵操作时机/方式会破坏TextRenderer的渲染状态,引发异常。
正确实现方案
1. 定位按钮渲染逻辑
找到ModMenu中负责模组按钮渲染的类(通常是ModListEntry或同层级类),在其渲染方法中仅针对文字渲染环节做局部矩阵变换,不影响按钮其他元素。
2. 局部矩阵缩放的正确写法
在调用TextRenderer.draw()前后,通过push()/pop()隔离矩阵状态,避免污染后续渲染:
// 按钮渲染方法内的文字渲染片段 matrixStack.push(); // 保存当前矩阵状态 float textScale = 0.8f; // 自定义文字缩放比例 // 仅缩放XY轴,Z轴保持1.0避免深度渲染问题 matrixStack.scale(textScale, textScale, 1.0f); // 注意:文字坐标需除以缩放比例,否则会偏离按钮位置 textRenderer.draw(matrixStack, modName, x / textScale, y / textScale, 0xFFFFFF); matrixStack.pop(); // 恢复原矩阵,不影响按钮背景、边框等渲染
3. 异常规避要点
- 必须保证
push()和pop()成对出现,否则会导致矩阵栈失衡,抛出IllegalStateException。 - 不要在按钮渲染的全局矩阵上直接缩放,只针对文字渲染做局部变换。
- 若使用事件系统拦截渲染,需精准命中文字渲染阶段,而非整个按钮渲染流程。
4. 替代方案:静态修改字体大小
如果不需要动态调整,可通过替换TextRenderer的字体资源实现全局文字大小修改(需配合资源包配置):
// 示例:创建自定义字体的TextRenderer(适配Fabric/Forge环境) TextRenderer customTextRenderer = new TextRenderer( client.getTextureManager(), client.getResourceManager(), client.getWindow().getScaleFactor(), false, false );
常见错误排查
- 画面错乱:检查是否误将缩放应用到了按钮的背景、边框渲染环节,需严格隔离文字渲染的矩阵操作。
- 矩阵异常:核对
push()与pop()的数量是否匹配,确保矩阵栈状态正确。
内容的提问来源于stack exchange,提问作者elinsanodemc
相关产品推荐
相关产品推荐

