C# 统一三维滑动运动

C# 统一三维滑动运动,c#,unity3d,C#,Unity3d,我试图制作一个FPS游戏,但当我按下w键一点,然后释放时,它会比我想要的滑得更远。我对Unity还很陌生,我认为这与更新有关。 代码: public float moveSpeed=5f; 公众浮力=5f; 公共字符控制器; 专用矢量3移动方向; 公众浮标; void Start() { 控制器=GetComponent(); } 无效更新() { float yStore=moveDirection.y; moveDirection=(transform.forward*Input.GetAx

我试图制作一个FPS游戏,但当我按下w键一点,然后释放时,它会比我想要的滑得更远。我对Unity还很陌生,我认为这与更新有关。 代码:

public float moveSpeed=5f;
公众浮力=5f;
公共字符控制器;
专用矢量3移动方向;
公众浮标;
void Start()
{
控制器=GetComponent();
}
无效更新()
{
float yStore=moveDirection.y;
moveDirection=(transform.forward*Input.GetAxis(“垂直”)+(transform.right*Input.GetAxis(“水平”);
moveDirection=moveDirection.normalized*moveSpeed;
moveDirection.y=yStore;
if(controller.isground)
{
移动方向y=0f;
if(Input.GetButtonDown(“跳转”))
{
移动方向。y=跳跃力;
}
}
moveDirection.y=moveDirection.y+(Physics.gravity.y*gravityScale);
控制器移动(移动方向*时间增量);
}

向地面添加物理材质,并将动态摩擦力设置为1。接下来,将静摩擦力从0.5设置为1。最后但并非最不重要的一点是,将“反弹”设置为0

对这些值稍加调整,直到找到令人满意的结果。 以下是指向文档的链接:


它基本上解释了每个属性的作用。

一般来说,一个问题可能是
moveDirection.normalized
。。这确保即使轴为例如
0.0001、0.0001
,它仍将标准化为幅值
1
的向量。。。通常,很少使用
ClampMagnitude
来处理这个用例,然后使用刚体。。我不知道CharacterController在引擎盖下是如何工作的,但也许它不会立即停止刚体。我试过这个,但它对我不起作用。
public float moveSpeed = 5f;
public float jumpForce = 5f;
public CharacterController controller;

private Vector3  moveDirection;
public float gravityScale;

void Start()
{
    controller = GetComponent<CharacterController>();
}

void Update()
{
    float yStore = moveDirection.y;

    moveDirection = (transform.forward * Input.GetAxis("Vertical")) + (transform.right * Input.GetAxis("Horizontal"));
    moveDirection = moveDirection.normalized * moveSpeed;
    moveDirection.y = yStore;

    if (controller.isGrounded)
    {
        moveDirection.y = 0f;

        if (Input.GetButtonDown("Jump"))
        {
            moveDirection.y = jumpForce;
        }
    }

    moveDirection.y = moveDirection.y + (Physics.gravity.y * gravityScale);
    controller.Move(moveDirection * Time.deltaTime);
}