首页 > 解决方案 > 为什么 CharacterController 运动时 CharacterController.velocity 的 x 和 z 值始终为 0?

问题描述

我有一个附加到游戏对象的CharacterController组件。

在下面我的代码的简化版本中,我将该控制器的 x 和 z 速度分配给 Vector3。


    [SerializeField]
    private CharacterController controller;

    private Vector3 characterVelocity;
    private Vector3 horizontalVelocity;
    
    private float realSpeed;

    void Update()
    {
        
        characterVelocity = controller.velocity;
        horizontalVelocity = new Vector3(controller.velocity.x, 0, controller.velocity.z);
        realSpeed = horizontalVelocity.magnitude;

    }


我使用的脚本与 Unity 文档用于CharacterController.Move. 如上述示例所示,既CharacterController.Move用于水平运动,又用于跳跃,似乎使 x 和 z 无效CharacterController.velocity

在调试中查看 Inspector 窗口时,Vector3“水平速度”字段应显示 CharacterController 沿 x 和 z 平面移动的速度。但是当玩家移动时,这些字段保持为 0,如下图所示:

在此处输入图像描述

当角色跳跃时,y 速度按预期显示它的数据。为什么 x 和 z 值不显示任何数据?

标签: c#unity3d

解决方案


将您的CharacterController.Move呼叫合并为一个呼叫CharacterController.Move。作为CharacterController.velocity国家的文件(强调我的):

返回的速度只是调用CharacterController.Moveor之前和之后当前时间步长的距离差CharacterController.SimpleMove

也就是说,它只返回一次调用前后的差异——而不是简单地返回任意数量的调用


推荐阅读