-
[졸업작품] 턴제 게임을 만들자 #4 1 : 1 합유니티3D/졸업작품 2023. 7. 11. 11:01
이정도면 업로드 주기를 그냥 두 달로 봐도 무방할 거 같다.
변명을 해보자면, 1:1 합 기능까지 제대로 만들어 두고선 제주도로 교회 수련회도 다녀오고, 친구와 TRPG 약속을 잡고, 그걸 준비하느라 개발을 한참 쉬었다.
물론 7월 중으로 가는 TRPG라서, 아직도 준비중이다. 하지만 이게 내 직접적인 스펙이 되는것도 아니고.. 꽤 쉬었으니, 이젠 다시 정신차리고 돌아와야지.
지난번엔 합을 진행할 플레이어와 적을 클릭하는 이벤트 까지를 만들었었다. 이번에는 그 둘이 클릭된 상태에서, 합 시작 버튼을 누르면 합을 진행하고, 패배한 쪽이 데미지를 받는 것 까지 해볼 것이다.(버프/디버프는 아직 아니다. 순수한 데미지 만 주고 받는걸 구현해볼 것이다.)
이번에 사용될 함수들이다. 실행순서는 가장 아래 CompareStart()의 호출로 시작해, WhoIsWin()으로, 또 거기서 Compare() 함수 호출로 마무리된다.
그럼, 함수를 하나하나 펼쳐보자.
Compare() 함수에선, 지정된 두 대상간의 합을 진행한다.
두 대상의 스킬 위력 비교는 뺄셈을 이용했다. 플레이어의 스킬 위력값에서 적의 스킬 위력값을 뺀다. 플레이어 스킬 위력이 더 세다면 양수가 나올 것이고, 같으면 0, 작으면 음수가 나올 것이다. 이에 따라 플레이어 위력이 더 크면 1을, 같으면 0, 적의 위력이 더 크면 -1을 반환해준다. 만약, 어떠한 오류로 해당 함수가 제대로 실행되지 않으면 -2를 반환한다.
WhoIsWin()에선 Compare()함수가 실행되고 나온 결과를 검사한다. 사실 플레이어와 적의 합 성패여부만 따진다면, 이 함수는 필요없다. 하지만 궂이 이 함수에서 결과를 한 번 더 검사하는 이유는 [합에서 비길 때] 때문이다.
합에서 비긴다면 합을 한 횟수만 증가시키고 다시 합을 진행시켜야 한다. Static 변수를 써, 한 함수 내에서 이를 해결할 수도 있겠지만, 합 횟수를 저장하는 변수는 두 대상 간의 합이 진행될 동안만 존재했다가 합이 종료되면 바로 사라져야 한다. 궂이 Static으로 처음부터 만들어둘 이유가 없다는 것이다.
이렇게 합에서 이기거나 지는 경우만 남게 되면, 마지막으로 CompareStart()에서 경우에 맞게 피해 함수를 호출해준다.
이것은 CharacterBehavor 클래스 안의 Attack과 Hurt 함수다.
둘 다 적과 상호작용을 하는 함수인데, 타깃지정이 없다. 왜일까?
CompareManager에서 이미 서로 타깃이 되는 둘의 정보를 저장해주기 때문이다.
CompareManager가 이미 둘의 상호작용을 만들어주는데, 궂이 객체 단위까지 내려가 상호작용을 만들어줄 필요가 없다는 것이다.
그러므로, 서로 데미지를 주고 받는 상호작용은 CompareManager::CompareStart()에서 둘의 Attack, Hurt를 불러오는 것으로 끝을 낸다.
여기까지 해서 1:1 합 지정과 그에 따른 결과를 내놓기 까지 성공했다.
실제 실행 결과. 플레이어 위력 8, 적 위력 0으로, 플레이어가 합에서 승리하여, 적에게 8 데미지를 입혔다. 이제 다음으로는 합의 경우가 아닌, 방어/회피/반격/반사 의 네 가지 방어행동에 대한 판정을 만들고, 1:1이 아닌, 3:3 까지 합을 지정한 뒤 실행할 수 있도록 만들 것이다. 업로드 주기가 더이상 길어지지 않도록 노력도 하고말이다..
'유니티3D > 졸업작품' 카테고리의 다른 글
[졸업작품] 턴제 게임을 만들자 #3 합 매니저 만들기(1) (0) 2023.05.17 [졸업작품] 턴제 게임을 만들자 #2.5 코딩노트(1) (0) 2023.05.02 [졸업작품] 턴제 게임을 만들자 #2 플레이어 설계 (0) 2023.04.27 [졸업작품] 턴제 게임을 만들자 #1 구상 (0) 2023.04.14