unity3d 在Unity2d中使用新的输入系统时,Dash不会增加播放器的速度

rekjcdws  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在开发一个2D平台(使用Unity和新的输入系统),并试图实现一个破折号(类似于空心骑士/塞莱斯特)。破折号应该推动玩家水平向前(取决于玩家面对的位置),只能在跳跃时激活。
然而,Dash似乎并没有在游戏测试中发挥作用。
当我尝试跳跃和短跑时,玩家只以与跑步速度相同的速度水平向前移动。协程中的其他一切似乎都工作正常(包括TrailRenderer)。
冲刺时感觉好像没有增加速度。
这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{

    //drag and drop the component to the script in the inspector
    public Rigidbody2D rb;

    public Transform groundCheck;
    public LayerMask groundLayer;
    public Animator myAnimator;
    public ParticleSystem dust;
    
    //this will make the public float accessible in the inspector
    private float horizontal;
    public float speed = 8f;
    public float jumpingPower = 16f;
    private bool isFacingRight = true;
    
    //coyote time
    public float coyoteTime = 0.1f;
    private float coyoteTimeCounter;
    
    //Dash goes here
    bool canDash = true;
    bool isDashing;
    [SerializeField] float dashForce = 30f;
    [SerializeField] float dashTime = 0.2f; 
    [SerializeField] float dashCooldown = 1f;
    [SerializeField] TrailRenderer dashTrail;
    //Dash Ends here
    
    void Start()
    {
        canDash = true;
    
    }
    
    
    void Update()
    {
        if (IsGrounded())
        {
            coyoteTimeCounter = coyoteTime;
        }
        else
        {
            coyoteTimeCounter -= Time.deltaTime;
        }
    
        if (!isFacingRight && horizontal > 0f)
        {
            Flip();
        }
        else if (isFacingRight && horizontal < 0f)
        {
            Flip();
        }
    
        if (isDashing)
        {
            return;
        }
    
        //Falling();
    
    }
    
    private void FixedUpdate()
    {
        rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);
    
        if (isDashing)
        {
            return;
        }
    }
    
    
    public void Move(InputAction.CallbackContext context)
    {
        horizontal = context.ReadValue<Vector2>().x;
    
        if (Mathf.Abs(horizontal) > 0f)
        {
            myAnimator.SetBool("isRunning", true);
        }
        else
        {
            myAnimator.SetBool("isRunning", false);
        }
    }
    
    
    public void Jump(InputAction.CallbackContext context)
    {
        
        if (context.performed && coyoteTimeCounter > 0f)
        {
            CreateDust();
            rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
        }
    
        if (context.canceled && rb.velocity.y > 0f)
        {
            rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
    
            coyoteTimeCounter = 0f;
        }
    }
    
    
    private bool IsGrounded()
    {
        return Physics2D.OverlapCircle(groundCheck.position, 0.5f, groundLayer);
    }
    
    private void Flip()
    {
        CreateDust();
        isFacingRight = !isFacingRight;
        Vector3 localScale = transform.localScale;
        localScale.x *= -1f;
        transform.localScale = localScale;
    }
    
    
    public void Dash(InputAction.CallbackContext context)
    {
        if (context.performed && canDash && !IsGrounded())
        {
            StartCoroutine(Dash());
        }
    }
    
    private IEnumerator Dash()
    {
        canDash = false;
        isDashing = true;
        float originalGravity = rb.gravityScale;
        rb.gravityScale = 0f;
        rb.velocity = new Vector2(transform.localScale.x * dashForce, 0f); //issue? feels like the player isnt speeding up   
        dashTrail.emitting = true;
        yield return new WaitForSeconds(dashTime);
        dashTrail.emitting = false;
        rb.gravityScale = originalGravity;
        isDashing = false;
        yield return new WaitForSeconds (dashCooldown);
        canDash = true;
    }
    
    void CreateDust()
    {
        dust.Play();
    }

}

我猜错误是由于协程中的这一行,但我不确定用什么来替换它:

rb.velocity = new Vector2(transform.localScale.x * dashForce, 0f);

希望这是有意义的。这是我第一次在Unity项目上工作,我正在Udemy和Youtube上学习教程-但我似乎找不到这个问题的答案。任何帮助都很感激!

h5qlskok

h5qlskok1#

是的,你只是用一个全新的速度向量替换了现有的速度向量,因此没有考虑之前设置的任何东西。
这种情况表明,为什么选择Unity clearly says
在大多数情况下,不应直接修改速度,因为这可能导致不切实际的行为-请改用AddForce。
通过计算速度而不是力和方向,人们很容易陷入陷阱,在计算中犯一个小错误,这将毁了一切,此外还失去了物理引擎的好处,在其一边以正确的方式处理运动。任何中断这样复杂的机器将导致不自然的感觉行为放在第一位,许多不必要的影响第二和第三位。
所以,总结一下:如果你使用向量,通常它足以构造他们一次(从输入),然后只变换-规范化,乘法,反转,旋转(四元数 * 向量3)如果需要,削减未使用的轴为2D和高兴的是,有零毛刺的一面。
希望我能帮到你。保持棒极了:)

相关问题