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

Unity2D冲刺攻击时如何锁定玩家输入,避免方向变更?

Unity2D 冲刺攻击方向锁定问题

我是Unity2D新手开发者,已实现俯视角角色移动与基础攻击功能,现在尝试实现Dash&Attack(冲刺攻击):当玩家同时按下奔跑键与攻击键时,角色加速移动一段距离后恢复常规速度。我希望在冲刺发起时锁定角色,让其沿初始朝向完成冲刺,不允许通过输入改变方向(或缩短冲刺距离),但尝试多种条件后,输入仍会被响应处理。我的Movement Controller(移动控制器)与Combat Controller(战斗控制器,处理基础攻击及冲刺攻击逻辑)为分离脚本,以下是相关代码片段:

移动控制器(Movement Controller)代码

private void Update()
{
    GatherInput();
}

private void GatherInput()
{
    _moveDirection.x = Input.GetAxisRaw("Horizontal");
    _moveDirection.y = Input.GetAxisRaw("Vertical");
    _isRunning = Input.GetButton("Run");
}

private void FixedUpdate()
{
    UpdateAnimations();
}

private void UpdateAnimations()
{
    if (_moveDirection != Vector2.zero)
    {
        _pc_Animator.SetBool("isMoving", true);
        MovementUpdate();
    }
    else
    {
        _pc_Animator.SetBool("isMoving", false);
        _pc_Animator.SetBool("canMove", false);
    }

    if(Time.time > timeToBlink)
    {
        doBlinkRoutine = DoBlink();
        StartCoroutine(doBlinkRoutine);
    }
}

private void MovementUpdate()
{
    _moveDirection = new Vector2(_moveDirection.x,_moveDirection.y).normalized;
    facingDirection = _moveDirection;

    if (canMove)
    {
        if (!_isRunning)
        {
            _pc_RB.MovePosition(_pc_RB.position + _moveDirection * _moveSpeed * Time.fixedDeltaTime);
            _pc_DirtAnimator.SetBool("isRunning", false);
        }
        else
        {
            _pc_RB.MovePosition(_pc_RB.position + _moveDirection * _moveSpeed * _runningSpeedMultiplier * Time.fixedDeltaTime);
            _pc_DirtAnimator.SetBool("isRunning", true);
        }
    }

    _pc_Animator.SetBool("canMove", canMove);
    _pc_Animator.SetFloat("moveX", _moveDirection.x);
    _pc_Animator.SetFloat("moveY", _moveDirection.y);
}

冲刺攻击(Dash & Slash)逻辑代码

private void Update()
{
    CheckCombatInput();
    CheckAttack();
}

private void FixedUpdate()
{
    RunSlashMovement();
}

private void CheckCombatInput()
{
    if (combatEnabled)
    {
        if (Input.GetButtonDown("Attack"))
        {
            // 普通攻击
            gotAttackInput = true;
            lastInputTime = Time.time;
        }
        if (Input.GetButton("Run") && Input.GetButtonDown("Attack") && _pcController.GetMoveDirection() != Vector2.zero)
        {
            // 冲刺攻击
            gotAttackInput = true;
            lastInputTime = Time.time;
            isRun_Slash = true;
        } 
    }
}

private void CheckAttack()
{
    if(gotAttackInput)
    {
        if(!isAttacking && !isRun_Slash)
        {
            gotAttackInput = false;
            isAttacking = true;
        
            // 动画相关
            _pc_Animator.SetBool("isAttacking", isAttacking);

            // 剑轨迹位置设置
            _pcSwordTrailTransform.position = attackHitBoxPos.position + (facingDirectionIn3D * 0.5f);

            _pcSwordAnim.SetBool("isAttacking", isAttacking);
            _pcSwordAnim.SetFloat("posX", facingDirectionIn3D.x);
            _pcSwordAnim.SetFloat("posY", facingDirectionIn3D.y);

            // 播放攻击音效
            PlaySwordAttackSFX();
        } 
        else if (isRun_Slash) 
        {
            if (Time.time >= runSlashCooldown) 
            { 
                gotAttackInput = false;

                // 动画相关
                _pc_Animator.SetBool("isRun&Slash", isRun_Slash);
                _pcSwordAnim.SetBool("isRun&Slash", isRun_Slash);
                _pcSwordAnim.SetFloat("posX", facingDirectionIn3D.x);
                _pcSwordAnim.SetFloat("posY", facingDirectionIn3D.y);

                // 播放攻击音效
                PlaySwordAttackSFX();

                runSlashCooldown = Time.time + 1f;
            }
        }
    }
    if (Time.time >= lastInputTime + inputTimer)
    {
        gotAttackInput = false;
    }
}

private void RunSlashMovement()
{
    if (isRun_Slash) 
    { 
        _pcRB.MovePosition(_pcRB.position + new Vector2(_pcController.GetMoveDirection().x, _pcController.GetMoveDirection().y) * 3.25f * _pcController._moveSpeed * Time.fixedDeltaTime);
    }
}

内容的提问来源于stack exchange,提问作者Andres Martinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:24:54