총선 투표날. 사전투표를 하였기에 개발만 하였습니다.

 

오늘은 Character의 Hit Event가 여러번 일어나는 것을 방지하는 작업을 하였습니다.

 

처음에 고려한 것은 Semaphore였습니다.

 

Component와 OverlapStart 이벤트가 발생하면 Semaphore 값을 올려주고,
OverlapEnd 이벤트가 발생하면 Semaphore 값을 내려주는 방식입니다.

 

그리고 Semaphore 값이 1일 때에만 최초 타격으로 인정하여 데미지가 가해집니다.

 

하지만 막상 구현을 해놓으니, 움직일 때는 물론이고 가만히 있을 때에도 생각하는것 만큼 Semaphore 값이 잘 작동하지 않았습니다.

 

다음 구현한 방식은 Mutex를 사용하는 방식입니다.

 

nullptr로 초기화된 UCapsuleComponent 변수를 하나 두고, OverlapStart 할 때마다 이 변수 값을 체크합니다.

 

변수 값이 nullptr이면 최초 타격으로 인식하여 데미지를 주고, 값을 저장합니다.

 

변수 값이 nullptr이 아니면 두번째 세번째 타격이기에 데미지를 주지 않습니다.

 

하지만 이 방식도 문제가 있었습니다.

 

여러번 타격을 하는 과정에서 Mutex가 꼬이는 경우가 발생하였고, 값의 초기화가 안되기도 하였습니다.

 

최종적으로 결정한 것은 이 Mutex를 두개를 사용하는 것입니다.

 

각각의 변수는 최초 타격 Component와 피격 Component입니다.

 

판정 시 두 변수가 모두 nullptr이면 최초 타격으로 인식하고, 타격 Component와 피격 Component를 저장합니다.

 

또한 기존에는 OverlapEnd 시에 판정을 초기화 하지만, 이번에는 이 과정도 OverlapStart 이벤트에 추가하였습니다.

 

아직은 팔에는 Collision이 Ignore 되지 않아 몸을 통과하기에, 동일 Component에 2번 Hit 이벤트가 발생할수도 있기 때문입니다.

 

위의 두 변수에 저장된 Component들과 동일한 타격 판정이 일어나면, 두 변수 값을 nullptr로 초기화 합니다.

 

또한 이 외에 Hit Montage가 재생이 끝난 뒤에도 위 초기화 과정을 추가하였습니다.

 

그 결과, 타격 모션 1회당 판정이 1번만 발생하도록 하였습니다.

 

이후 각 Mesh의 Part들에게 Ignore Collision을 두려고 하였으나, 한번 오류가 나서 실패를 하고 원래대로 돌린 상태입니다.

 

내일은 이 실패한 부분을 구현하고, Hit 이벤트 부분에 변화된 점을 살펴본 뒤 구현을 수정할 예정입이다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.04.18 개발일지  (0) 2020.04.18
20.04.16 개발일지  (0) 2020.04.16
20.04.13 개발일지  (0) 2020.04.13
20.04.11 개발일지  (0) 2020.04.11
20.04.09 개발일지  (0) 2020.04.09

+ Recent posts