Question>
UDK로 prototype game을 만들고 있음.
현재, 만든 game의 근접 공격 system이 animation에 따라서
범위 판정이 달라져 버리는 bug가 존재함.
(참고로 현재 무기 collision의 touch event로 타격 판정을 하고 있음.)
좀 더 정확한 근접 공격 판정을 구현하려면,
어떤 방법을 쓰는 게 좋겠는가?
-------------------------------------------------------------
Answer>
무기 collision의 touch event로 충돌을 판별할 경우,
collision model이 다소 두툼하기 때문에, ^^;;;;;;;;;;;;;;
충돌의 정확도가 상당히 떨어 질 수 있습니다.
따라서,
더 정밀한 근접 공격 판정을 위해서는
아래의 2가지가 더 필요합니다.
1> Trace() 함수의 이용.
일반적으로 책이나 UDN에 알려진
근접 공격을 정확하게 판정하는 방법은
class Actor에 정의되어 있는 Trace() 함수를 이용하는 겁니다.
function Actor Trace(
out vector HitLocation,
out vector HitNormal,
vector TraceEnd,
optional vector TraceStart,
optional bool bTraceActors,
optional vector Extent,
optional out TraceHitInfo HitInfo,
optional int ExtraTraceFlags
);
Trace() 함수의 경우, 'Extent'라는 parameter로
충돌의 정밀도를 조절할 수 있습니다.
가장 정밀한 충돌을 원하시면,
vect( 0, 0, 0)을 넣으시면 됩니다.^^;;;;
2> anim notify의 적용.
칼을 휘두르는 motion에서 공격 충돌을 처리한다면,
motion이 시작되는 단계에서부터 충돌을 검사한다면,
충돌 검사의 정확도가 떨어 질 수 있습니다.
공격 충돌의 정확도를 높이려면,
칼이 적을 마주한 정면을 지나기 직전부터 충돌을
검사해야 정확한 검사가 이루어 집니다.
따라서, 공격 충돌 검사를 정확하게 하려면,
검사를 시작하는 시간을 공격 motion에 명시적으로 각인시켜,
game에 인지시킬 필요가 있습니다.
이 때, anim notify를 사용합니다.^^
anim notify를 motion에 입력하는 방법은
'animset editor'와 관련된 web page에서 찾아서 보시기 바랍니다.^^;;;
위 2가지를 같이 적용한다면,
정밀하면서, 빠르고, 정확한 공격 충돌 판정을 처리할 수 있습니다.^^
P.S.
저 같은 경우, Trace()는 안쓰고, anim notify는 씁니다.^^;;;;;;;;;;
즉, anim notify 발생시,
발생시점부터 일정 시간동안만,
위치, 방향, 범위, 거리로만 공격 충돌을 판정합니다.
Trace()를 안쓰기 때문에, 충분히 간단하게 처리할 수 있습니다.
(하지만, 정확도는 조~금~ 떨어집니다.^^;;;;;)
이렇게 하는 이유는
network play 진행시, game에 무리를 주지 않기 위해서 입니다.^^
Trace()를 자주 쓰면,
정확하게는 공격 충돌 판별을 할 수는 있지만,
game에 전체적으로 무리를 줘서, frame이 낮아지는 원인이 됩니다.
따라서,
위치, 방향, 범위, 거리로만 공격 충돌을 판정할 경우,
정확도는 조~금~ 떨어지지만, 전체적인 frame은 더 좋아 집니다.
그리고,
공격 충돌의 판정 시간이 anim notify와 연결되어 있기 때문에,
정확도는 다소 떨어지더라도,
공격 충돌 판별의 어색함은 확실히 없앨 수 있습니다.^^
P.S.2
정확도가 조~금~ 떨어진다고 하더라도,
player가 불만을 느낄 정도로 정확도가 떨어 져서는 안됩니다.@_@;;;;
그런 상황이라면, 무리를 해서라도, Trace()를 써야 합니다.
Tag:
안기훈, Kee Hoon Ahn, Unreal, UDK, iPhone, iPad, app, 앱, iOS
스크립해가요~