본문 바로가기
게임 개발/[D2D_Portfolio] DirectX2D 포트폴리오 작업일지

29. Monster Factory 추가 & RigidBody 및 충돌 개선

by 헛둘이 2023. 4. 19.

Monster Factory 추가

- 지금 게임 오브젝트가 컴포넌트 패턴으로 조립되다보니, 하나의 객체를 내보내기까지 신경써야 할 것들이 많다

- 사람이다보니 실수를 할 수 있기 때문에, 오브젝트의 공통적인 부분들을 모아서 마치 공장에서 만드는 공산품(?) 처럼 만들어내기 위한 일련의 작업들을 추가했다.

- Transform, MeshRenderer, Material, Mesh 이런 컴포넌트들은 대부분의 객체가 가지고 있기 때문에 객체가 생성될 때 자동으로 붙여서 생성되도록 했다.

- RigidBody, Physical, Movement, Animator, DebugRenderer 등의 컴포넌트는 객체의 특성에 따라 붙일지 말지 결정되기 때문에 이 부분은 객체를 생성한 후 그 스코프 안에서 처리하는게 낫다고 생각했다.

(좀 더 작업해보고 이 부분도 간소화할 수 있으면 추가적인 함수를 팔 생각이다)

- 그리고 몬스터의 경우 애니메이션과 AI를 이루는 행동패턴 클래스들을 각기 관리하기엔 너무 시간이 오래 걸려서 이 부분 또한 Factory 클래스에 위임하기로 했다.

- 이 부분을 작업할 때 많은 고민을 했었는데 나중에 스테이지와 맵을 만들 때 몬스터가 맵에 추가되게끔 할 생각이라 툴에서 이 몬스터를 그때 그때 생성해서 추가하기 위해서 동일한 인터페이스를 맞추기 위함이다.

 

RigidBody 및 충돌 개선

- 타일 충돌을 계속 테스트해보니 또 여러 버그가 있었다.

- 현재 RigidBody에서 Velocity를 관리하고 있는데, 플레이어가 한번 움직일 때 그 방향으로 일정한 힘을 주게 하는 시스템이다. (이 벡터에 DeltaTime을 곱해서 매 프레임 일정하게 나아간다)

- 그런데 이 RigidBody에서 속도를 매 프레임 들고 있으니, 속도를 다시 재조정할 때까지 그 속도로 무한히 나아가는 것이다.

- 그렇다고 매 프레임 속도를 초기화하자니 중력의 자연스러운 표현을 위해서 y축은 내버려둬야할 것 같다

- 그래서 당장은 x축 속도만 처리하고, y축 속도는 뒀다가 각 State에서 처리해주는 방법을 택했다.

- 그리고 타일 충돌의 경우 Raycast로 계속 처리하고 있었는데, 프레임 탓에 정확한 위치 계산을 종종 놓치는 경우가 발생했다. 

- 그래서 Raycast로 계산하지 않고, 마찬가지로 PhysX에서 제공하는 computePenetration이라는 함수를 사용했다.

https://dev-treadmill.tistory.com/167

 

11. Geometry Query

PhysX의 Geometry Query란 쉽게 말해 Geometry에 대한 충돌 검색 기능이라고 한다 Raycast - 레이(빛 줄기)를 Geometry와 테스트한다 Swift - 한 Geometry를 다른 Geometry와 교차하는 첫 번째 점을 찾기 위해 라인을

dev-treadmill.tistory.com

 

- 이 함수는 두 Geometry가 얼마나 침투했는지를 계산하고, 깊이와 방향을 반환해준다.

- 깊이와 방향을 곱한 벡터를 현재 위치에다 더해주면 충돌을 벗어나게 되므로, 깊이가 Zero가 아니라면 매 프레임 위치를 보정해주게 했다.

- 이렇게 했더니 전보다 훨씬 깔끔하고 부드러운 충돌이 이루어졌다.

 

etc.

- 그 밖에 몬스터 스폰/파괴 이벤트 처리

 

내일 할 일 

- 파티클 시스템을 통해 타격 시 먼지가 튀는 듯한 효과 구현

댓글