Game Development, 게임개발/개발일지

버프 시스템,Buff System 에 대한 고찰

게임이 더 좋아 2022. 2. 27. 20:55
반응형
728x170

 

우리는 게임을 만들 때 버프라는 것이 있다.

캐릭터에게 좋은 효과를 주면 버프

상대방의 뭔가를 방해하면 디버프라고 한다.

 

그렇다면 이러한 버프는 어떻게 만들어져서 오브젝트에 적용되어야 하는 것일까?

 

알아보자하면.. 내가 다 아는 것 같고 사실 하나도 모른다..

그냥 생각해보자

 


 

우선 단발적인 스킬과 다르게 버프에는 지속시간이라는 개념이 존재한다.

뭐 스킬 자체도 몇 초라는 스킬 효과시간이 있겠지만.. 통틀어서 지속시간이 존재하는 스킬을 버프라고 해보자.

 

내 인생 첫 RPG는 항상 잊을 수 없지

 

음.. 저기에 다 있네???

 

저기서 얻을 수 있는 정보는

 

버프 아이콘

버프 지속시간

버프 지속시간 비례 까만 부분

버프 여러개일 때 배치

등이 있다.

 

우리는 버프를 게임에 적용하기 위해서 무엇이 필요할까????

 

0. 사용자가 버프를 사용할 수 있는 상황인지?

 

CanBuff? 버프를 쓸 수 있는 상황인지를 파악해야한다는 말이다.

 

뭐 재사용시간 대기일 수도 있고, MP가 부족할 수도 있고..

이미 중복된 버프가 여러가지가 있어서 쓰지를 못한다던가 여러가지 조건이 붙을 수 있다.

그렇다면 우리는 이 조건이 True인지 False인지를 조건을 이용해서 알아내야 한다.

 

예를 들어보자

해당 스킬이 MP 40 소모하고 재사용대기시간이 300초다.

그렇다면 저 스킬을 쓰려면 재사용대기 시간이 300초 지나서 사용가능해져야 하며

MP가 40 이상 남아있어야 한다.

 

흠... MP는 그냥 체크하면 될텐데... 300초 시간?? 흠.., 어떻게 재지?

 

60분이란 어떻게 재는거지...?

 

여기서 과제 하나가 생겼다.

 

★★★★ 재사용대기 시간을 어떻게 판단할 것이냐???

 

크게 2가지가 있다.

 

1. 스킬을 쓸 때 시간을 플레이어가 가지고 있는다.

2. 스킬을 쓸 때 시간을 서버가 가지고 있는다.

 

1번의 경우에는.. 플레이어가 가지고 있다.. 즉, 저 60분짜리 스킬을 쓰면 해당 시간이 플레이어에게 저장되어

플레이어의 스킬 사용시간에 맞추어 스킬의 사용가능 여부를 알 수 있다.

다만 클라이언트, 로컬에 존재하면 해킹...의 위험이 있다.

** 하지만 뭐 숨겨놓거나 암호화한다면 상관없다.

** 또한 처음의 플레이어 데이터를 서버에서 받아온다고 하면 저 정보가 스킬 사용과 동시에 서버에도 저장되어야 시간으로 초래되는 버그가 발생하지 않을 것이다.

 

2번의 경우에는 간단하다. 

서버가 가지고 있고 플레이어가 현재 접속해있는 시간이 서버가 계산한 시간을 지나면 사용가능해질 것이다.

 

음.. 뭐가 좋을까??

 

나같은 경우에는.. 1번이다.

서버가 상대하는 것은 수많은 클라이언트이기 때문에 서버에서 연산이 많이 일어나는 것은 좋지 않다.

더군다나 서버에서 플레이어 하나하나마다 스킬에 대해 재사용대기 시간을 체크해준다???

이것은 비효율적이라고 생각한다.

 

**아무튼 내 생각이 그런거지.. 절대 정답은 없다.

 

 

아무튼 그렇게 되면 우리는 스킬을 사용하기 전에 재사용대기 시간을 알아본다.

 

함수를 하나 만들어주어야 할 듯 하다.

GetRemainCooldown -> 남은 재사용대기 시간을 알려주는 함수

즉, GetRemainCooldown이 0이 되면 또는 0보다 작아지면? 스킬을 쓸 수 있다는 것이다.

 

예를 들어보자

 

1시 10분에 썼으면 60분 재사용대기 시간을 가진 스킬을 2시 10분에 다시 쓸 수 있다.

남은 시간을 구하려면

시작 시간 : 1시 10분

끝나는 시간 : 2시 10분 = 시작시간 + 재사용 대기 시간(60분)

현재 시간과 끝나는 시간 사이의 시간 : 2시 10분 - 현재 시간

남은 시간은 그렇게 되겠다.

현재 남은 시간 = 끝나는 시간 - 현재 시간이 되겠다.

 

**물론 클라이언트가 사용할 것이라면.. 이 계정에 대한 정보를 서버에 업데이트함은 필수다.

만약 저장하지 않는다면 게임 종료하고 다시 들어오면... 스킬을 바로 쓸 수 가 있는 버그가 생겨버린다.

 

 


 

다음은 무엇이 있을까?

 

버프가 적용되려면 현재 버프가 사용중인지를 알아야 한다.

 

1. 버프가 사용되었는지??

Is Applied? 뭐 적용되었다가.. Apply를 써도 적절한지는 모르겠으나.. 예를 들어서 그렇다.

 

그렇다면 버프가 사용중인지를 어떻게 파악할까?

 

역시 이것도 위와 비슷하다.

스킬의 지속시간을 보자

이 스킬은 30분 지속시간을 가지고 있다.

 

그렇다면

 

스킬이 시작된 시간 : 1시 10분

스킬의 효과가 끝나는 시간 : 1시 40분 = 시작 시간 + 지속 시간

스킬의 효과가 적용되는 시간 : 1시 10분 ~ 1시 40분 사이

하지만 저 시간을 직접하는 것은 비효율적이기에

남은 스킬 적용시간 = 1시 40분 - 현재시간

 

얘도 GetRemainSkillTime을 만들어서 구하면 되겠다.

 

이로써.. 

버프에 대한 간략한 로직과 고찰을 마쳤다.

 

여기서 가장 중요한 4가지 요소는

CanUse?

IsApplied?

GetRemainCooldown

GetRemainSkillTime

이 있겠다.

 

IsApplied가 True일 때 플레이어에게 효과를 적용하면 되는 것이고

CanUse일 때 플레이어가 스킬을 사용할 수 있게 해주면 된다.

 

스킬 아이콘이며.. 남은 시간 보여주는 것은 위의 로직으로 충분히 설명 가능하다.

남은 시간 비례해서 이미지의 까만 부분이 차오르는 것도 충분히 위의 로직으로 가능하다.

 

 

실무에서 일을 하다보면 항상 최적의 답을 찾을 수는 없다.

하지만 이렇게 생각을 나누다 보면.. 누군가 피드백을 주고 더 발전된 로직이 나오지 않을까???

아무튼 버프 시스템에 대한 간략한 고찰은 이만 마치도록 하겠다.

 

 

728x90
반응형
그리드형