2024-06-12

지난 프로젝트에 차량이 나무, 자동차, 건물 등과 부딪혔을 때, 폭발하거나 연기가 나는 효과를 더해주고 싶었다.
처음에는 애니메이션을 통해 부딪힌 위치에 불이나 연기가 나게 해야할까 생각했지만,
유니티에서 지원하는 파티클 시스템을 통해 해결할 수 있었다.
Simple Particles FX - Toon Effect 무료 에셋을 활용했다.
자동차가 부딪히면, Smoke , Explosion , Crash , Fire 4개 중 랜덤으로 파티클이 생성된다.
파티클이라고 부르는 매우 작은 이미지, 메시를 시뮬레이션하고 렌더링하여 시각 효과를 부여한다.
파티클 시스템 컴포넌트에 매우 많은 프로퍼티가 있지만,
강의에서 다룬 내용 중 사용될만한 부분만 훑어보기로 하였다.
파티클이 움직이는 속도, 크기, 회전, 최대 파티클 수를 정한다.
오른쪽의 토글을 열어 Constant 와 Random Between Two Constant 등을 통해 상수 값과 랜덤한 값을 설정할 수 도 있다.
| Property | 기능 |
|---|---|
| Duration | 파티클 시스템이 지속되는 시간 |
| Looping | 파티클 시스템이 끝나면, 다시 재생될지 |
| Start Delay | 시작하기 전, 기다리는 지연 시간(초) |
| Start Lifetime | 파티클의 초기 수명 |
| Start Speed | 해당 방향으로 작용하는 파티클 초기 속도 |
| Start Size | 각 파티클의 초기 크기 |
| Start Rotation | 각 파티클의 초기 회전 각도 |
| Start Color | 각 파티클의 초기 색상 |
| Simulation Space | Local - 부모 오브젝트와 함께 이동 , World - 월드 공간에서 애니메이션 화 |
| Play On Awake | 활성화하면 오브젝트가 생성될 때, 파티클 시스템이 자동으로 시작 |
파티클을 어떻게 보여줄 지를 정의한다.
어떤 파티클을 표현할 지, Order in Layer 는 어떻게 되는지 등을 결정한다.
| Property | 기능 |
|---|---|
| Material | 파티클을 렌더링하기 위해 사용되는 머터리얼 |
| Order in Layer | 정렬 레이어의 렌더러 순서 |
생성되는 모양에 대한 내용을 정의한다.
박스, 콘, 도넛 형태 등 다양한 생성 형태를 정의한다.
각 생성 형태마다 다른 프로퍼티를 가지고 있다.
아래는 Circle 모드로 설정된 경우의 Shape Module 이다.
| Property | 기능 |
|---|---|
| Shape | 방출되는 모양 |
| Radius | 모양의 원형 부분의 반지름 |
| Arc | 전체 원의 각도 비율 |
파티클이 생성될 1초당 생성량, 움직일 때 생성될 양, 한번에 왕창 생성되는 패턴 등을 정의한다.
| Property | 기능 |
|---|---|
| Rate over Time | 시간 단위 당 방출되는 파티클 수 |
| Rate over Distance | 이동한 거리 단위 당 방출되는 파티클 수 |
| Bursts | 파티클을 생성하는 이벤트, 아래의 5가지 설정을 통해 지정된 시점에 파티클을 방출 |
| Time | 파티클 시스템이 시작된 이후로 버스트를 방출할 시점을 초 단위로 설정 |
| Count | 방출되는 파티클 수를 설정 |
| Cycles | 버스트를 반복할 횟수를 설정 |
| Interval | 버스트가 반복되는 시간 사이의 간격(초)을 설정 |
| Probability | 각 버스트 이벤트가 파티클을 생성할 가능성 ( 1.00 이면 100% 로 생성 ) |
화살 투사체가 충돌했을 때, 파티클 시스템이 생성되고 투사체는 사라진다.
이전 프로젝트의 ProjectileController.cs - DestroyProjectile( ) 메서드에
파티클 시스템을 생성하는 코드를 추가해주었다.
private void DestroyProjectile(Vector3 position, bool createFx)
{
if (createFx)
{
ParticleSystem particleSystem = GameManager.Instance.EffectParticle;
particleSystem.transform.position = position;
ParticleSystem.EmissionModule em = particleSystem.emission;
em.SetBurst(0, new ParticleSystem.Burst(0, Mathf.Ceil(attackData.size * 5)));
ParticleSystem.MainModule mm = particleSystem.main;
mm.startSpeedMultiplier = attackData.size * 10f;
particleSystem.Play();
}
gameObject.SetActive(false);
}
화살이 오브젝트에 닿으면 노란색 원 파티클이 생성된다.
파티클을 직접 만들어보기도, 이미 만들어진 에셋을 통해 파티클을 생성해보기도 하였다.
파티클 시스템을 통해 발자국 남기기, 불이나 연기의 연출, 물이 튀는 듯한 연출 등을 그럴듯하게 표현할 수 있으니, 게임의 완성도를 높이기 위해 적절히 활용하면 좋을 것 같다.