在Minecraft Forge 1.19.X中如何获取当前玩家速度或玩家对象?
我的世界模组开发:逐帧获取玩家速度方案
一、获取客户端玩家对象的常用方法
- Fabric/Quilt模组:直接用
MinecraftClient.getInstance().player,这是最便捷的客户端玩家实例获取方式,注意只在客户端环境下可用,别在服务端代码里调用。 - Forge模组:用
Minecraft.getInstance().player,逻辑和Fabric一致,同样是客户端专属的获取途径。
二、获取玩家速度的两种实用方式
方式1:用官方提供的getSpeed()方法
你提到的LivingEntity.getSpeed()是MC官方封装好的方法,直接调用玩家对象的这个方法就能拿到当前移动速度值,代码示例:
// 假设已经拿到Player实例player float currentSpeed = player.getSpeed();
返回的数值单位是格/游戏刻(1游戏刻=0.05秒),如果要转成更直观的格/秒,乘以20就行。
方式2:通过运动向量计算真实速度
如果需要更精准的实际移动速率(比如包含坠落、冲刺等状态的合速度),可以直接读取玩家的运动向量计算:
// 获取横向(X、Z轴)的运动向量 double motionX = player.getVelocity().x; double motionZ = player.getVelocity().z; // 用勾股定理计算横向速度,乘以20转为格/秒 double horizontalSpeed = Math.sqrt(motionX * motionX + motionZ * motionZ) * 20; // 如果要算包含垂直方向的总速度: double motionY = player.getVelocity().y; double totalSpeed = Math.sqrt(motionX * motionX + motionY * motionY + motionZ * motionZ) * 20;
这种方式能反映玩家真实的移动状态,适合追求精准数值的场景。
三、逐帧更新速度的实现思路
要做到逐帧获取并显示速度,得绑定客户端的tick事件或渲染事件:
- Fabric/Quilt:注册
ClientTickEvents.END_CLIENT_TICK事件,在每客户端刻结束时更新速度变量,之后在HUD渲染事件里绘制数值:ClientTickEvents.END_CLIENT_TICK.register(client -> { if (client.player != null) { // 这里更新全局或类内的速度变量 currentSpeed = client.player.getSpeed(); } }); - Forge:可以注册
ClientTickEvent,或者直接在自定义HUD的渲染方法里实时获取速度——因为渲染方法本身就是逐帧调用的,省得单独维护tick事件。
四、避坑提醒
- 所有客户端玩家操作必须在客户端线程执行,别在服务端代码里碰这些逻辑,不然会报错。
- 显示HUD是纯客户端行为,速度计算如果只用于显示,完全可以只在客户端处理,不用同步到服务端。
内容的提问来源于stack exchange,提问作者CodeWizard777
相关产品推荐
相关产品推荐

