One_KWS

게임 개발 일지 #3 - PlayerController 개발 본문

게임 개발

게임 개발 일지 #3 - PlayerController 개발

One-Kim 2023. 1. 9. 21:20

Player Controller

Player Controller는 플레이어의 각 행동들을 제어하는 역할을 한다. 이동 중 공격 버튼을 눌렀을 때 이동을 멈추고 공격을 해야하고 공격 중에는 이동, 대쉬가 되지 않고 대쉬 중에도 이동, 공격이 되지 않게 하는 등 플레이어가 어떤 행동을 하는지에 따라 다르게 처리하도록 했다.

 

공격

플레이어가 공격할 때는 아래와 같은 규칙을 따른다.

  • 플레이어가 이동 중이라면 이동을 멈추고 공격한다.
  • 플레이어가 대쉬 중이라면 공격이 되지 않는다. (나중에 대쉬+공격 기능을 넣는다면 다르게 해야 될 것 같다.)

위의 규칙에 따라 코드는 아래와 같이 작성하였다.

private void Attack() {
    if (playerDash.IsOngoing) {
        return;
    }
    
    if (playerMovement.IsOngoing) {
        playerMovement.Cancel();
    } 
    
    playerCombat.Execute();
}

이동

플레이어의 이동은 대쉬나 공격중에는 실행되지 않는다. 따라서 코드는 아래와 같이 작성했다.

private void Move() {
    if (playerCombat.IsOngoing || playerDash.IsOngoing) {
        return;
    }
    
    playerMovement.Execute();
}

대쉬

플레이어의 대쉬는 공격 중에는 실행되지 않기 때문에 아래와 같이 구현했다.

private void Dash() {
    if (playerCombat.IsOngoing) {
        return;
    }
    
    playerDash.Execute();
}

 

Health

Health 클래스는 플레이어나 몬스터, 보스의 체력 관련 처리를 한다. (데미지 계산 및 죽음 등) 데미지를 받았을 때 남은 체력을 계산하고 (남은 체력이 0 이하라면 죽음 처리) 델리게이트를 통해 데미지를 입었을 때  다른 클래스에서도 처리할 수 있도록 했다.

...

public Action<float> OnHit;
public Action OnDead;
public bool IsDead = false;

...

public void TakeDamage(float damage) {
    healthPoint -= damage;

    if (healthPoint <= 0) {
        SetCharacterDead();
        return;
    }

    OnHit?.Invoke(damage);
}

private void SetCharacterDead() {
    animator.SetTrigger("death");
    OnDead?.Invoke();

    IsDead = true;
}