개발일지/스파르타 코딩클럽 부트캠프
[TIL] 14주차 4일 트러블슈팅
치치베베
2024. 7. 18. 19:29
여러가지 버그 수정
이동중에 메인메뉴 UI 키면 계속 달리는 버그
public virtual void Update()
{
Move();
if (UIManager.Instance.onUI)
{
stateMachine.MovementSpeedModifier = 0f;
StartAnimation(stateMachine.Player.AnimationData.IdleParameterHash);
}
}
스테이트머신에 UI가 켜져있는 상태라면
플레이어의 속도를 0으로 만들고, Idle상태로 돌아가게끔 설정하여 해결했다.
스킬 사용중에 다른 스킬을 누르면 멈추는 버그
체크포인트에 상호작용 시 모든 인풋이 안들어가게 하기
protected virtual void AddInputActionCallbacks()
{
if(UIManager.Instance.onUI) return;
if (GameManager.Instance.Player.isSkillActive) return;
PlayerController input = stateMachine.Player.Input;
input.PlayerActions.Movement.canceled += OnMovementCanceled;
input.PlayerActions.Jump.started += OnJumpStarted;
input.PlayerActions.Attack.performed += OnAttackPerformed;
input.PlayerActions.Attack.canceled += OnAttackCanceled;
input.PlayerActions.Dodge.started += OnDodgeStarted;
input.PlayerActions.FirstSkill.started += OnFirstSkillStarted;
input.PlayerActions.SecondSkill.started += OnSecondSkillStarted;
input.PlayerActions.ThirdSkill.started += OnThirdSkillStarted;
input.PlayerActions.SkillSlotSwap.started += OnSkillSlotSwap;
}
public void ChangeState(IState state)
{
if (UIManager.Instance.onUI) return;
currentState?.Exit();
currentState = state;
currentState?.Enter();
}
두 문제는 onUI상태일 때는 아예 State가 바뀌지않도록, 하고 IsSkillActive가 true일 경우 인풋이 들어가지 않게하여 해결했다.
죽고나서 부활할 때 Idle상태로 돌아가지 않는 부분
public override void Update()
{
if(stateMachine.Player.isRespawn == true)
{
stateMachine.ChangeState(stateMachine.IdleState);
stateMachine.Player.isRespawn = false;
}
}
DeathState의 Update함수에 리스폰이 되었다면 Idle상태로 되돌리도록 설정
플레이어 그라운드 체크용 레이 추가
private void FixedUpdate()
{
stateMachine.PhysicsUpdate();
if (Rigidbody.velocity.y < 0)
{
Vector2 leftRayOrigin = Rigidbody.position + Vector2.left * 0.3f;
Vector2 middleRayOrigin = Rigidbody.position;
Vector2 rightRayOrigin = Rigidbody.position + Vector2.right * 0.3f;
Debug.DrawRay(leftRayOrigin, Vector2.down * 2f, Color.yellow);
Debug.DrawRay(middleRayOrigin, Vector2.down * 2f, Color.yellow);
Debug.DrawRay(rightRayOrigin, Vector2.down * 2f, Color.yellow);
RaycastHit2D leftRayHit = Physics2D.Raycast(leftRayOrigin, Vector2.down, 2f, groundLayer);
RaycastHit2D middleRayHit = Physics2D.Raycast(middleRayOrigin, Vector2.down, 2f, groundLayer);
RaycastHit2D rightRayHit = Physics2D.Raycast(rightRayOrigin, Vector2.down, 2f, groundLayer);
if (leftRayHit.collider != null && leftRayHit.distance > 0.5f)
{
isGrounded = true;
}
if (middleRayHit.collider != null && middleRayHit.distance > 0.5f)
{
isGrounded = true;
}
if (rightRayHit.collider != null && rightRayHit.distance > 0.5f)
{
isGrounded = true;
}
}
}
바닥이 인식이 안될 때가 있어서 ( 땅 모서리 접촉 시 ) 중간 지점에서 Vector2.left, Vector2.right를 통해 위치를 조금씩 조정하여 레이를 추가하였다.
죽고나서도 몬스터와 접촉 시 넉백이 적용되는 버그 수정
private void OnTriggerStay2D(Collider2D collision)
{
if (collision.tag == "monster" && !isEnemyDead)
{
enemyDamage = collision.gameObject.GetComponent<StatHandler>().CurrentStat.statsSO.damage;
bool isChangeHealth = healthSystem.ChangeHealth(-enemyDamage);
if(isChangeHealth && healthSystem.CurrentHealth > 0) OnHitKnockback(collision.transform.position);
Debug.Log(healthSystem.CurrentHealth);
}
}
몬스터와 충돌 시에 넉백이 일어나는 OnHitKnockback에 플레이어의 체력이 0보다 크고, 체력이 변화할 때만 넉백이 되도록 조건문을 추가하여 해결했다.