You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:15:50