저작물 참고 필자도 해당 내용을 공부하고 있는 입장으로 주로 오픈 문서, 포럼, AI 질의 응답을 활용하여 관련 내용을 공부하였습니다. 따라서 틀린 내용이 있을 수 있습니다.
다만, 타인(AI 등)의 저작물을 침해하지 않도록 순서, 과정, 스크린샷, 코드 등 다른 저작물을 활용 또는 포함하지 않았으며, AI 등 인터넷 자료는 오로지 기술 원리 이해의 목표로만 활용하고, 본 게시글에 언급된 과정, 흐름, 본문, 게시한 코드는 AI의 복붙 없이 모두 필자가 사전에 알고 있는 그래픽스 기술과 인터넷 상에 공개된 개념을 통해 모두 직접 시도하며 직접 작성하였음을 밝힙니다. 부득이하게 어떤 자료를 인용하는 경우는 링크로 출처를 남기고 인용합니다.
일단 이번 게시글에서 구현할 사항은 유니티 엔진에서 제공하는 파티클 시스템을 사용해서 특정 평면과 충돌 처리를 하는 경우, 해당 위치에 데칼 메시를 생성하여 충돌 자국을 나타내는 것 까지를 주요 목표로 한다. 매우 쉬운 방법으로 기록할 것인데, 매우 쉬운 만큼 퍼포먼스에 지장이 있을 수 있다. 즉 수십만개, 수백 만개를 표현하기에는 무리가 있는 기법이기에 이런 경우 GPU 인스턴싱을 사용하거나 구현해야 하는데 이 경우는 매우 복잡해진다.
컴퓨트 쉐이더라는 것을 나는 사용해본 적이 없는데 컴퓨팅 쉐이더를 통해 구현이 가능하다고 하니 이는 추후 시도해보고 기록으로 게시할 것이다.
아무튼 엔진에서 파티클 시스템을 하나 생성한다. 여러가지 설정이 있는데 설정에 관련해서는 AI에게 물어보면 잘 답변해주므로 여기서는 모두 다루지는 않는다. 나도 대부분 모르는 것들이다. (내가 파티클 시스템을 구현한 것이 아니기 때문이다.) 우선 기본적으로 Particle 시스템의 속성들을 보면 다양하게 있는데 Renderer 항목이 주요 렌더에 관련된 사항들이다.
아무래도 CPU 렌더링 방식이다보니 속성이 매우 다양하다. 기본 값은 Billboard 모드로 되어 있는데 하나의 평면이 생성되어 사용자 카메라를 향하는 모습으로 구현된다. 따라서 어디에서 보든지 모양이 방향이 동일하다.
Render Mode에는 다음과 같은 속성이 있다.
Billboard
Streched Billboard
Horizontal Billboard
Vertical Billboard
Mesh
None
Billboard 는 항상 카메라를 바라보는 모드이고, Streched Billboard 는 속도에 따른 것이라고 하는데 잘 모르겠다. 뭐 총알 불꽃 같은 느낌이려나?
다음으로 Horizontal, Vertical 이 있는데, 특정 축만 고정하고 특정 축만 카메라를 향하도록 해준다. 쉽게 말하면 Horizontal은 무조건 땅에 붙어있는 것... 이고 Vertical은 무조건 세워져있는 것... 정도라고 보면 된다. Vertical 은 비 정도로 생각하면 좋다. 단순히 Plane을 만들어서 땅으로 내리면 Plane 위의 텍스처가 화면 시점이 바뀜에 따라서 그 객체의 회전 정도가 눈에 보이기 때문에 어색하다. 따라서 y축의 회전을 카메라의 방향 벡터와 동기화시켜두면 아래로 흐르는 느낌은 들되 카메라 방향이 회전되어도 따라오도록 구현할 수 있다.
particleSystem.GetCollisionEvents
즉 해당하는 ParticleSystem 컴포넌트를 가져와서 GetCollisionEvents 를 수행하면 된다.