1. 개요
지난 시간까지는 포켓몬스터의 기본 구조와 UI, 배틀 필드 등을 구성해보았다.
이번 시간에는 굉장히 많은 걸 구현해 보았는데, 하나하나 다 소개해보겠다.
배틀 필드에서 실제로 배틀이 일어나는 순차적 흐름을 구현하려고 해보았고, 현재 60% 정도의 진행도라고 생각이 된다.
이제 슬슬 게임의 모양이 갖춰지고 있다는 것이 느껴진다.
2. 설계
게임의 상태를 나타내는 game state 라는 것을 제어하는 것이 중요하다.
각 state와 그에 대한 설명을 덧붙이겠다.
Starting 상태는 말 그대로 시작 상태로, 시작하면 등장 씬과 대사가 나오며 이후엔 BattleMenu 상태로 넘어간다.
배틀 메뉴에서는 메뉴 중 선택한 것에 따라 SkillMenu, PokeMenu, BagMenu, Runstate로 상태가 변화한다.
SkillMenu는 스킬을 고르는 상태
PokeMenu는 포켓몬을 고르는 상태
BagMenu는 가방에서 도구를 확인하는 상태
RunState는 도망갈 때의 상태이다.
각 State에서의 동작은 다음과 같다.
SkillMenu : 화살표를 눌러 사용할 기술으로 커서를 옮길 수 있고, Z를 누르면 커서가 올라간 칸의 기술을 사용한다. 또, X를 누르면 BattleMenu로 돌아간다. 기술을 사용하고 나면 상대와 나의 스피드나 우선권 등을 파악하여 선공자가 먼저 공격하고 후공자가 나중에 공격하는 등의 배틀 흐름을 작성한다.
PokeMenu : 화살표를 눌러 교체할 포켓몬으로 커서를 옮길 수 있고, Z를 누르면 커서가 올라간 칸의 포켓몬으로 교체한다. 또, X를 누르면 BattleMenu로 돌아간다. 교체 후엔, 상대 포켓몬의 공격이 1회 진행된다.
BagMenu : 화살표를 눌러 사용할 도구로 커서를 옮길 수 있고, Z를 누르면 커서가 올라간 칸의 도구를 사용한다. 또, X를 누르면 BattleMenu로 돌아간다.
RunState : 상대와 나의 속도를 비교하여 빠르면 교체 성공, 느리다면 확률 계산 후 실패 시 상대 포켓몬의 공격이 1회 진행된다.
이 때 또 중요한 것이, SkillMenu 에서 공격을 고르고 전투가 진행되었을 때 전투 중 포켓몬이 사망하면 필드의 종합적인 상황을 고려하여 게임이 끝나도록 설계하여야 한다.
이번 시간에는 Starting, SkillMenu, PokeMenu를 중점적으로 구현해보겠다.
3. 구현
(1) Starting state 구현
우선 BattleFieldController.cs에 새롭게 enum 변수를 선언해주자.
이 State를 기반으로 하여 작동이 결정된다.
위의 두 함수를 적용하면 포켓몬의 등장씬을 구현할 수 있었다.
기존에 작성한 함수들을 잘 조합한 것으로 특별히 어려운 내용은 없다.
(1) BattleMenu state 구현
우선 UI 객체로 다음과 같이 만들어준 후에 BattleMenu에 접속시킨다.
BattleMenu State 일 때 프로그램을 제어하는 함수이다.
switch(BMPointer)... 되어 있는 부분에는 커서를 조작하는 내용이 포함되어있다.
BMPointer는 현재 Battle Menu의 커서가 어디 있는지 나타내는 것으로, 화살표의 입력과 현재 커서의 위치에 따라 다음 커서의 위치를 설정해주는 역할을 하는 것이다.
커서 조작은 전부 이런 원리로 사용하였다.
(1) SkillMenu state 구현
BattleMenu에서 사용했던 메뉴를 그대로 사용하되, 초기화 과정을 거쳐줄 것이다.
각 칸의 테두리 색은 포켓몬의 기술의 타입에 할당해 둔 색으로 초기화하며, 텍스트는 기술명을 넣어준다.
이 때 SkillMenu 안에서 플래그를 통한 컨트롤을 진행했는데, 나중에 따로 배틀 전용 state를 만들어 그 안에서 플래그 컨트롤을 하는 것이 좋겠다.
아무튼 myAttackFirst(mySkill, enemySkill)은 선공권을 누가 가지고 있는지 알려주는 bool 함수로, 기술의 우선도와 양 포켓몬의 속도를 비교하여 우선권을 정하게 된다.
위와 같이 구현되다. 기술의 priority 값이 낮은 쪽 (이 더 빠르게 공격한다) 이 우리팀이면 true, 동률이면 속도를 비교하여 우리팀이 빠르면 true, 그마저도 동률이면 1/2 확률로 true가 나온다.
SkillMenu는 이정도이다. 배틀 플로우도 이 함수 안에 구현했는데, 보면 볼수록 잘못된 방식이라는 생각이 들어서 대대적으로 손 볼 생각이다. 현 시점에서는 일단 작동이 잘 된다는 것만은 알 수 있어 만족이다.
(2) PokeMenu state 구현
위 함수를 통해 포켓몬 선택창을 조절할 수 있다.'
switch(PokemonPointer)... 부분은 SkillMenu 때와 마찬가지로 커서를 컨트롤하는 부분이다.
이후엔 포켓몬이 교체되는 부분까지 구현했다. 향후에 상대 포켓몬의 1회 공격까지 연결시킬 생각이다.
4. 작동확인
5. 향후계획
이제 거의 다 왔다는 생각이 든다
우선 배틀 시스템부터 조금 손 보고, 가방, 도망 메뉴 등도 작성해보겠다.
현재 데미지만 구현이 되어있는데, 향후에 반동, 상태이상 걸기, 도트데미지 등등을 구현해보겠다.
'Unity 개발일기' 카테고리의 다른 글
Unity 포켓몬스터 모작(5) - 배틀 시 풀죽음과 랭크변화, 반동 데미지 구현 (0) | 2024.09.06 |
---|---|
Unity 포켓몬스터 모작(4) - 배틀 필트 컨트롤하기3 (2) | 2024.09.04 |
Unity 포켓몬스터 모작(3) - 배틀 필트 컨트롤하기 (0) | 2024.08.31 |
Unity 포켓몬스터 모작(2) - 배틀 UI 만들기 (1) | 2024.08.30 |
Unity 포켓몬스터 모작(1) - 기본적인 구조 작성하기 (0) | 2024.08.29 |