Unity 포켓몬스터 모작(7) - 턴 시작 시 상태이상 구현, 교대 및 출현 특성 구현,
1. 개요
이번 시간에는 상태이상 중 턴이 시작될 때 적용되는 상태이상을 먼저 구현해보겠다. (수면, 얼음, 마비)
또한, 포켓몬이 처음 필드에 등장한 순간 발동하는 특성들이 있는데, 이를 구현해보겠다. (예를 들어, 위협 특성을 가진 포켓몬은 등장 시 상대편 포켓몬의 공격을 1랭크 하락시키는 등)
추가로 포켓몬의 랭크가 올라가거나 내려갈 때 포켓몬의 색을 바꿔주어 시각적인 표현을 덧입혀보겠다.
2. 설계
(1) 턴 시작 상태이상
지난 시간에는 상태이상 6종에 걸리고 그에 대한 UI가 표시되도록 하는 내용을 만들었다.
그 중, 턴이 시작될 때 상태이상의 영향을 받는 상태이상은 세 종류로 마비, 수면, 얼음 상태이상이다. 각 상태이상 별로 살펴보자.
마비 : 25%의 확률로 몸이 저려 움직일 수 없다. 확률적으로 상태이상이 해제되거나 하지는 않는다.
수면 : 수면에 걸린 포켓몬은 잠에 들어 행동하지 못한다. 수면에 걸린 첫 턴에는 반드시 자고, 턴이 한 턴 지날 때마다 1/3씩 깨어날 확률이 증가하여 4번째 턴에는 (즉 수면에 걸려 행동을 못한 턴이 3턴 지나고 나면) 반드시 눈을 뜨게 된다.
얼음 : 20%의 확률로 얼음 상태가 풀린다. 특정 기술들에 맞게된다면 풀리기도 한다. (ex. 열탕)
(2) 출현 시 발동하는 특성
포켓몬이 등장하는 순간 발동하는 특성들이 존재한다.
위협 : 등장 시 상대 포켓몬의 공격 1랭크 하락, 그래스메이커 : 등장 시 필드에 그래스필드 설치 등 다양한 특성들이 존재하는데, 오늘은 우선 위협에 대해서만 구현해보자.
3. 구현
(1) 턴 시작 상태이상 구현
지난 시간까지 작성되어있던 코드에서 위의 세 줄이 추가되었다.
사실 세 줄이 아니라, 조건문으로 상세 내용이 더 있다. 하나씩 살펴보자.
마비인 경우 25%의 확률로 몸이 저려 움직일 수 없고, 몸이 저리지 않았다면 정상적으로 공격을 수행한다.
GetStatusErrorCount() 함수가 있는데, PokeStatus에 StatusErrorCount 값을 추가했다.
수면에 걸린 턴 수를 컨트롤하는 데에 사용된다. 또한, 향후에 맹독 상태이상을 추가할 때 역시 이를 사용하여 컨트롤할 예정이다.
아무튼 위와 같이 작성하면 첫턴 0%, 둘째턴 1/3, 셋째턴 2/3, 이후 확정으로 눈을 뜨고 행동이 가능하다.
하지만 눈을 뜨지 못한 턴에는 공격을 할 수 없다.
20%의 확률로 풀린다.
풀리지 않은 턴에는 얼어붙어 움직일 수 없다.
(2) 출현 시 발동하는 특성 구현
포켓몬의 특성에 따라 발동한다.
우선 현재로서는 위협 특성에 대해서만 구현이 되어 있다. 향후 추가 예정.
MyAbilityActivated와 EnemyAbilityActivated는 bool 변수로, 처음에 양쪽 모두 특성발동을 하는 경우가 있는데 이런 경우 더 빠른 포켓몬부터 특성 발동을 하여 양쪽 다 발동이 되어야 한다. 때문에 이를 효과적으로 제어하기 위해 추가한 변수이다. 밑을 보면 이해가 더 빠를 것이다.
처음에 배틀 시작할 때 원래는 바로 배틀메뉴 상태로 넘어갔었는데, 사이에 특성 발동 과정을 추가한 것이다.
천천히 읽어보면 이해하기 어렵지 않을 것이라고 생각한다.
(3) 시각적 요소 추가
PokeAnimationController.cs 파일에 위와 같은 코드를 추가한다.
각각 상황에 맞게 위의 함수들을 적용시키면 된다.
4. 작동확인
얼음 상태이상 해제되는 장면은 찍어올리지는 못했지만 제작 과정에서 해제되는 경우를 확인하였다.
5. 향후계획
각자의 턴 종료 후에 도트데미지를 받는 경우가 있는데, 이를 구현해보겠다. (화상, 독, 맹독 등)
또한 현재 마비에 의한 속도 디버프는 구현되지 않았는데 이 역시 구현해보겠다.
가방도 빨리 구현해야하는데 배틀 부분에 구현할 게 너무 많아서 계속 우선순위가 밀리고 있다... 금방 만들어보도록 하겠다.