본문 바로가기

언리얼엔진

25. Hit / Physics Simulation / Delta Seconds

Hit 이벤트

저번에 충돌 처리 중, Overlap을 봤다면 이번에는 Hit를 알아보자.

BP_Box의 자손 블루프린트로 BP_Hit를 만들었는데, 여기 오버라이드 함수 중에 있는 Hit 이벤트 함수를 추가한다.

● Hit 이벤트 : 이 액터가 블로킹 오브젝트에 부딛히거나 부딛힌 다른 액터를 블록할 때 이벤트를 발생한다.

                     캐릭터 무브먼트, Sweep을 켜고 Set Location을 사용할 때, Physics Simulation 등으로 인해 발생한다.

 

- My Comp : 내 어떤 컴포넌트가 Hit 했는지

- Other : 나와 충돌한 상대

- Other Comp : 충돌한 상대의 컴포넌트

- Self Moved : 본인이 직접 움직여서 충돌했는지의 여부


Collision의 충돌 판정을 변경하고 싶다면 해당 Collision 디테일의 콜리전 프리셋을 보면 된다.

여기선 BlockAll을 통해서 Hit 충돌을 구현한다.

 

- OverlapAll.Dynamic : 자기자신은 Dynamic이고, 모든 모든 대상에 대해서 곂침

- BlockAll : 기본적으로 자기자신은 WorldStatic이다.


Simulate Physics

Collision 컴포넌트에 보면 피직스에 Simulate Physics가 있다. 이 기능을 사용하게 되면 대상이 중력을 비롯한 물리 법칙의 영향을 받게 된다.

 

Physics Simulation 사용 중에 MassKg와 Mass Scale을 수정하여 대상의 질량을 바꿔줄 수 있다.


Simulation Generates Hit Events

기본적으로 Physics Simulation 중에는 Hit 이벤트를 발생시키지 않는다.

이 기능은 Physics Simulation 중에 이 물체가 충돌하면 Hit 이벤트를 발생시키는지의 여부를 말한다.

따라서 대상에 Hit 이벤트가 발생해야할 대상에서 기능을 켜주면 된다.


Append

Append 노드 사용 예시

연결한 문자열들을 모두 합쳐서 새 문자열을 만들어내는 노드이다. 앞의 A핀의 문자열부터 순서대로 합쳐진다.


Delta Seconds

매 초마다 물체를 전방으로 초당 100씩 움직이도록 한다고 해보자.

 

전방으로 움직이기 위해서 Actor의 Forward(전방)의 방향을 받아온다. - 속도

여기에 100의 플로트를 곱해준다. - 속력

 

Tick 이벤트 함수를 통해서 계속해서 이벤트를 발생시키게 될텐데, 여기서 Delta Seconds는 무엇일까?

Delta Seconds(또는 Delta Time)는 이전 Tick이벤트에서 다음 Tick이벤트가 호출되기까지의 걸린 시간을 말한다.

Speed * Delta = 초당 이동량. 따라서 Delta Seconds와 속도를 곱해주었다.

 

※ Delta Time이 필요한 이유

컴퓨터의 성능에 따라 FPS이 다를텐데 이에 따라 초당 값이 변화할 수 있다.

그래서 이전 업데이트부터 현재 업데이트가 호출되기까지의 걸린 시간을 계산하여 초당 변화량을 나타낼 수 있어 성능에 관련없이 항상 균일한 값을 도출해낼 수 있다.


이후 Set Location을 통해서 이동하게 된다면 짧은 거리를 계속하여 순간이동한다고 볼 수 있다.

그래서 캐릭터로 움직이는 물체와 충돌했을 때 계속해서 밀려나며 Hit 이벤트가 발생하지 않는다.

 

여기서 Sweep을 사용하여 Location으로 이동 시, 빈 공간을 연속적인 이동을 했다고 채워줌으로 써 캐릭터와 충돌 시에

Hit 이벤트를 발생시켜줄 수 있다.


Break Hit Result(히트 결과 분해)

Hit 이벤트에서 Hit 후 결과들의 가져올 수 있는 정보들이 있다.

- Location : 월드 공간 기준으로 Hit가 발생한 위치를 말한다.

- Normal : Hit 지점에서 Sweep 대상 오브젝트의 방향

- Hit Actor : 어떤 액터가 충돌했는지

- Hit Component : 어떤 컴포넌트가 충돌했는지

- Hit Bone Name : 충돌한 컴포넌트가 Mesh라면 Bone Name도 얻어올 수 있다.