게임 개발

게임속 캐릭터는 공격을 해야할까, 데미지를 입어야 할까?

술단고 2024. 5. 25. 19:23

 

이번 포스팅의 제목이 굉장히 의아할 수 있겠으나,

이는 객체지향을 기반으로 한 게임을 만들 때, (Unity이건, Unreal이건, GameMaker이건 모두 동일하다.)

반드시 개발자로서 숙지해야 할 기본적인 교양 중 하나이다.

 

당연히 둘 다 아닌가? 라고 생각할 수 있겠지만, 이는 개발적 접근에서의 이야기이다.

거두절미하고, 바로 본론으로 들어가자. (이 글의 요지는 두 번째 문단에 있다.)


플레이어 VS 몬스터

만약 Unreal 엔진을 이용해 플레이어와 몬스터끼리 싸우는 로직을 만든다고 해보자.

정말 간단한 예제기 때문에, 쉽게 만들었다.

언리얼 엔진의 블루프린트 클래스로 생성

 

우선 플레이어 클래스몬스터 클래스를 만들었다.

여기서는 Unreal 엔진을 사용했지만, 이는 Unity 엔진에서도 똑같이 적용되는 지식이다.

 

갑자기 나타나는 복잡해보이는 블루프린트... 너무 세세하게 보지 않아도 된다.

 

 

이후, 레벨 블루프린트에서 전역적으로 로직을 작성했다.

로직은 아래와 같다.

 

우선 게임이 시작하면, 플레이어 클래스와 몬스터 클래스로부터 객체를 하나씩 생성한다.

키보드 1번을 누르면 플레이어 객체가 몬스터 객체를 공격한다.
키보드 2번을 누르면 몬스터 객체가 플레이어 객체를 공격한다.

 

 

로직은 문제가 없어보인다. 당연히 컴파일 후 게임을 실행했을 때에도, 문제는 없다.

 

그러나, 이런 방식으로 게임을 개발하면, 정말 큰일난다.

물론 이 방식도 규모가 작은 게임이라면, 오히려 직관적으로 로직을 한 눈에 볼 수 있다는 장점이 있을 수 있다.

 

하지만 이 방식은 전혀 객체지향적이지도 않고, 프로젝트의 규모도 커질 수가 없는 구조이다.

 

만약, 플레이어가 공격할 수 있는 몬스터가 여러 종류라면?

한 맵에 몬스터가 1,000마리 있다면?

몬스터뿐 아니라 NPC도 공격할 수 있고, 게임 속 사물도 공격할 수 있고,

심지어는 게임이 추후 업데이트 되어 PVP가 추가되어 다른 플레이어도 공격할 수 있다면?

 

공격 가능한 사물마다 저 로직을 하나씩 전부 추가한다는 것은 말도 안되는 일일 것이다.

그래서 우리는 객체지향적으로 게임 로직을 짤 때,

어느 객체가 행할 수 있는 로직해당 객체의 클래스에 작성하곤 한다.

 

여기까지는 게임을 만들어본 사람이라면 누구나 알고있는 사항일 것이다.

 


 

공격을 할 것인가? 피해를 입을 것인가?

 

바로 이 문단이 이 글의 요지이자 핵심이다.

 

위 문제를 해결하기 위해, 플레이어몬스터 클래스에 각각 공격 로직을 만드려고 한다.

여기서 한 가지 의문점이 든다.

 

 

해당 객체가 다른 객체에게 피해를 주는 로직을 생성할까?
해당 객체가 다른 객체로부터 피해를 받는 로직을 생성할까?

 

 

 

 

둘 중 한 방식이 완벽한 정답이고, 나머지 다른 방식은 오답이다! 는 절대 아니다.

이는 게임의 규모에 따라, 게임의 방식이나 기획에 따라 얼마든지 변할 수 있는 답이다.

하지만 게임을 만들어본 경험이 꽤 있는 사람이라면, 우선 한 가지 답이 떠오를 것이다.

 

 

일반적으로는, 다른 객체로부터 피해를 받는 로직을 만드는 것이 정석이다.

 

 

 

플레이어 클래스에 있는 On Damaged 메서드. 우선 상속과 다형성을 고려하지 않고 만들었다.

 

 

위 로직은, 플레이어 클래스에 만들어 놓은 On Damaged 메서드이다.

On Damage가 호출되면, 인자로 받은 객체의 데미지 (공격력) 만큼 자신의 HP가 깎이게 된다.

 

여기서 두 가지 포인트가 있다면,

1. MAX (HP, 0) 을 사용해서, HP가 0 이하로 떨어지지 않는다.

2. Is Valid를 사용해서, 객체로서 할당되지 않은 변수가 받아졌다면 실행하지 않는다. (Null 체크)

 

즉, 피해를 입는 로직이다.

그렇다면 왜 피해를 입는 로직을 만드는 것이 일반적인걸까?

 

아래와 같은 사양이 존재하는 게임이 있다고 생각해보자.

 

보스 몬스터는 최근 10초동안 가장 많이 피해를 입힌 플레이어를 주목한다.

보스 몬스터는 사망 후, 자신에게 가장 피해를 많이 입힌 플레이어에게 보상을 많이 지급한다.

몬스터는 자신에게 걸린 버프와 디버프에 따라 입는 피해량이 달라진다.

모든 몬스터에겐 방어력이 존재해서, 입는 피해량이 어느정도 감소된다.

 

 

어딘가 특별할 것이 없는, RPG에서 일반적으로 자주 보이는 규칙들이다.

확실한건, 이 규칙들의 공통점은 피해를 입는 로직이 있을 때 더 구현이 쉽다는 점이다.

 

당연히 다른 객체에게 피해를 줄 때 구현이 더 쉬운 규칙들도 존재한다.

예를 들어, 특정 직업이나 특정 아이템이 있다면, 공격할 때 반드시 추가데미지를 준다거나,

플레이어에게 버프나 디버프가 있어 주는 최종 데미지에 변화가 있을 경우 말이다.

 

그러나 보통의 RPG 게임들에선 피해를 입는 로직에서 구현이 더 쉬운 규칙들이 많이 발생하기 마련이고,

조금 복잡하지만 피해를 입는 로직에서도 위 예외 사항들을 모두 구현할 수 있다.

 


 

 

물론 가장 중요한 건, 게임의 기획에 따라, 게임의 방식과 규칙에 따라 더 적합한 방식을 선택하는 것이 될 것이다.

 

공격을 주는 것과 피해를 입는 것 뿐만이 아니라, 게임에서 일어나는 수많은 상호작용들 중에서

영향을 주는 것이 좋을지, 영향을 받는 것이 좋을지, 어떤 방식의 메서드를 만들어야 할지는

개발자가 생각하기에 만드는 게임에 적합한 방식에 따라 달라지는 것이다.

 

이걸 더 잘 알기 위해선 물론 공부를 해야하는 것도 맞지만, 가장 중요한 것은 경험이라고 생각한다.

'이렇게 하면 안 됨?' 이 있다면, 그 방식대로 게임을 만들어보고,

나중에 뼈저리게 후회하는 것이 가장 좋은 학습인 것 같기도 하다...

'게임 개발' 카테고리의 다른 글

방치 모험가 공지사항 및 문의  (4) 2023.11.07
개인정보 처리방침  (0) 2023.10.27