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
相关产品推荐
相关产品推荐

