파티클 시스템
파티클 하나하나도 게임 오브젝트라 할 수 있는 데 양이 많기 때문에 이것을 체계적이고 효율적으로 관리하는 시스템이라 할 수 있다.
주요시스템으론
emitter(발사체)
particles(파티클)
animator(애니메이터)
renderer(렌더러)
등으로 이루어져있다.
주요모듈
Main 모듈
파티클 시스템 컴포넌트를 보면 바로 나오는 메인 모듈이다.
딜레이, 생명주기, 속도, 회전 등 기본적인 값을 설정할 수 있다.
Prewarm은 Looping이 켜져있을 때만 사용하는 것으로 오브젝트 풀과 같이 그냥 모든 파티클을 미리 생성해둬 초기화하는 것이다. 미리 생성해뒀기에 파티클 시스템 시작 시 초기화 작업이 필요가 없게되어 파티클 초기 실행 속도가 빨라질 것이다.
다만 처음 로딩 시간이 길어질 수 있는 단점도 있으니 적절히 써야할 것이다. 오브젝트 풀에서도 반복적으로 쓰이는 애들에 대해 오브젝트 풀을 쓴 것과 비슷한 맥락이다.
Simulation Space를 World 값으로 설정하면 월드 좌표계를 기준으로 생성된다.
값을 설정할 때 Random Between Two Constants를 선택 시에 단일 값이 아닌 두 값 사이에서 랜덤으로 선택될 수 있게 한다.
Start Lifetime을 보면 0.8과 1.2 사이에서 랜덤으로 몇 초간 지속될지 설정했다.
Renderer 모듈
보여지는 것들을 추가적으로 좀 더 정하는 모듈이라 보면 된다. 대표적으로 Order in Layer 값을 조절해 보여지는 것에 대한 우선 순위를 정해줄 수 있다.
Sorting Fude는 파티클 간의 우선순위로 숫자가 낮을 수록 위로 올라간다.
Emission 모듈
생성 조건과 관련된 모듈이다.
Rate over Time: 1초당 생성량
Rate over Distance: 이동한 거리당 생성될 양 (유니티 단위를 m라 하면 1m 당 생성될 양)
Bursts: 파티클을 생성하는 이벤트, 지정된 시점에 한 번에 확 생성되는 패턴을 만들 수 있음
Bursts
Time: 파티클이 생성될 시점
Count: 생성될 파티클 수
Cycles: 버스트가 반복되는 횟수
Interval: 버스트가 반복되는 주기
Probability: 생성될 확률로 1이면 100%로 무조건 생성한다는 거다.
Bursts 관련 코드
이번 프로젝트에선 Bursts부분을 코드로 조작해보고자 Count를 0으로 해두었다.
근데 투사체 게임오브젝트에 파티클을 자식으로 두지 않은 이유는 부모인 투사체 오브젝트가 SetActive() 되면 만일 길게 재생하는 파티클일 경우엔 문제가 생길 수 있다. 부모가 비활성화되면 자식도 비활성화 되기 때문이다.
그렇기에 공용으로 파티클 시스템을 두고 작업을 하여 Play를 하도록 하는 것이다.
공용으로 만들고 파티클 시스템을 운영한다.
EffectParicle 의 경우엔 게임매니저 코드에서 FindGameObjectWithTag로 가져오는 모습이다.
허나 이거는 지금은 파티클이 한 개라 임시로 가져온 것이지 효율적인 가져오기 방식은 아니다.
Shape 모듈
파티클의 모양을 설정하는 모듈로 다양한 모양을 선택할 수 있는 모습이다.
Radius Thickness: 얼마나 넓은 범위에서 나오는지
Animation Events 과 파티클의 결합
Animation Events 사용하여 걸을 때 때 효과가 나도록 해보자
일단 걸을 때 나는 DustParticles를 Player의 자식으로 두고 관련 코드를 작성한다.
파티클이 보여야 한다면 중복이 될 수 있으니 기존에 재생되던 파티클은 중지하고 다시 Play하는 모습이다.
이제 코드를 오브젝트에 달아야 하는데..
만일 애니메이션 이벤트에서 파티클을 사용한다하면 애니메이터가 달려있는 게임오브젝트 내에서의 함수만 실행가능하기에 이를 유의하자
Animation Events란?
Animation 창에서 프레임에 추가할 수 있는 기능으로
public 함수를 등록해두면 애니메이션의 특정 프레임 시점에 불러올 수 있음
이벤트를 등록하고 싶을 땐
해당 애니메이션이 부착된 오브젝트를 하이레키 창이나 씬 뷰에서 찾아 클릭해야 Animation 창에서 등록할 수 있다.
만일 부착된 오브젝트를 클릭하지 않고 Animation 창을 찾아가지 않는다면 위와 같이 재생버튼이 비활성화 될 것이다.
해당 오브젝트에 달려있는 애니메이션을 쉽게 접근할 수 있고 새로운 애니메이션 클립을 만들어줄 수도 있다.
이렇게 맞게 찾아간다면 이벤트가 발생되기를 원하는 프레임에 찾아가 애니메이션 이벤트를 등록하면 된다.
우클릭해서 생성해도 되지만
위의 아이콘으로도 쉽게 등록 가능하다.플레이어가 달리는 player_run 애니메이션의 1번째, 3번째 프레임에 애니메이션 이벤트를 달아주자
이벤트를 만들었으면 public 함수를 넣어주면 된다.
Amimation Events에 파티클 시스템 관련 코드를 사용한다면 해당 코드는 Animator가 있는 게임오브젝트에 부착해야한다.
근데 이러고 재생해보면 안보인다...
???
번외. 로직은 맞는데 파티클이 안보인다면
파티클을 찾아가 Renderer 모듈을 살펴보면 Order in Layer가 4인데 플레이어의 Main Sprite는 값이 5임을 볼 수 있다.
그러면 MainSprtie의 Order in Layer 값을 낮춰야할까...?
그렇게하면 다른 것들과 꼬일 수 있으니 해당 파티클을 플레이어 아래에 두어 겹칠일이 없도록 조치를 취하였다.
일단은 개발자가 집중적으로 볼 부분은 아닌거 같지만 Emission 부분은 알아두는게 좋아보다고 한다.
사실 글로 어느정도 정리하긴 했지만
https://docs.unity3d.com/kr/2023.2/Manual/class-ParticleSystem.html
공식 사이트에 잘 정리되어 있으니 참고해보는 것이 좋다.