【问题标题】:Player has little control over the character after dashing in midair玩家在半空中冲刺后几乎无法控制角色
【发布时间】:2021-04-26 16:31:42
【问题描述】:

我现在正在制作一个 2.5D 播放器控制器,但我在半空中的冲刺出现了问题。冲刺有效,但冲刺完成后,角色无法完全控制 X 轴,直到他们撞到地面。我希望玩家在冲刺后立即完全控制 X 轴,以便他们可以适当地躲避。

   void Update()
{
    PlayerInput();       
}

void FixedUpdate()
{
    xMovement();
    yMovement();
}

void PlayerInput()
{
    //Registers X and Y movement
    horizontalInput = Input.GetAxis("Horizontal");
    verticalInput = Input.GetAxis("Vertical");

    if (Input.GetButton("Run"))
    {
        isRunning = true;
    }
    else if (Input.GetButtonUp("Run"))
    {
        isRunning = false;
    }

    //Makes player jump by returning a bool value to "yMovement()" when pressed.
    if (Input.GetButtonDown("Jump"))
    {
        jumpRequest = true;
    }

    if (Input.GetKeyDown(KeyCode.A))
    {
        if (doubleTapTime > Time.time && lastKeyCode == KeyCode.A)
        {
            StartCoroutine(Dash(1f));
            Debug.Log("You dashed left");
        }
        else
        {
            doubleTapTime = Time.time + 0.5f;
        }

        lastKeyCode = KeyCode.A;
    }
       

    if (Input.GetKeyDown(KeyCode.D))
    {
        if (doubleTapTime > Time.time && lastKeyCode == KeyCode.D)
        {
            StartCoroutine(Dash(-1f));
            Debug.Log("You dashed right");
        }
        else
        {
            doubleTapTime = Time.time + 0.5f;
        }

        lastKeyCode = KeyCode.D;
    }
}

void xMovement()
{
    //Makes player walk left and right

    if (!isRunning && !isDashing)
    {
        transform.Translate(Vector3.left * walkSpeed * horizontalInput * Time.deltaTime);
    }

    //Makes player run left and right
    else if (isRunning && !isDashing)
    {
        transform.Translate(Vector3.left * runSpeed * horizontalInput * Time.deltaTime);
    }            
}

void yMovement()
{
    //Make player jump when Jump is pressed
    if (jumpRequest)
    {
        playerRb.velocity = new Vector3(playerRb.velocity.x, jumpForce);
        jumpRequest = false;
        //playerRb.velocity = new Vector2(playerRb.velocity.x, playerRb.velocity.y * jumpForce);
    }

    //Makes player fall faster in general, and when the Jump button is released
    if (playerRb.velocity.y < 0)
    {
        playerRb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplyer - 1) * Time.deltaTime;
    }
    else if (playerRb.velocity.y > 0 && !Input.GetButton("Jump"))
    {
        playerRb.velocity += Vector3.up * Physics.gravity.y * (lowJumpMultiplyer - 1) * Time.deltaTime;
    }
}

IEnumerator Dash(float direction)
{
    isDashing = true;
    playerRb.velocity = new Vector3(playerRb.velocity.x, .0f);
    playerRb.velocity = new Vector3(dashDistance * direction, 0f, 0f);
    playerRb.useGravity = false;
    yield return new WaitForSeconds(.2f);
    isDashing = false;
    playerRb.useGravity = true;

非常感谢任何有关代码优化的提示。我对编码还很陌生,我宁愿在必须改掉坏习惯之前学习适当的编码习惯。谢谢!

【问题讨论】:

  • 嗨,您可以尝试添加更多上下文或提供任何类型的演示,其他人可以使用它来帮助重现和帮助。
  • 玩家可以冲刺,只要冲刺结束就可以控制,只要他们在地上。问题是当玩家试图在半空中冲刺时。玩家可以在空中毫无问题地冲刺,但在完成冲刺后,玩家无法停止动力或改变方向,直到他们降落在地面上。就好像破折号将它们“拖”在空中,直到它们撞到地面。
  • 我希望玩家能够在他们愿意的情况下保持这种势头,但我也不想强迫他们向前移动直到他们着陆。

标签: c# unity3d game-development 2.5d


【解决方案1】:

我认为您的问题是,当您在 yAxis 上实际使用速度时,您在 x 轴上使用 transform 上的平移。 Unity 可能无法在单个“FixedUpdate”调用中处理这两个问题。或者它可能无法达到您的预期。

我建议坚持使用速度变化。所以这会给出类似的东西

void xMovement()
{
    //Makes player walk left and right

    if (!isRunning && !isDashing)
    {
        playerRb.velocity += Vector3.left * walkSpeed * horizontalInput * Time.deltaTime;
    }

    //Makes player run left and right
    else if (isRunning && !isDashing)
    {
        playerRb.velocity += Vector3.left * runSpeed * horizontalInput * Time.deltaTime;
    }            
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多