내일배움캠프 TIL

내일배움캠프 37일차 TIL "파티클 시스템"

Jooglorystar 2024. 11. 8. 21:00

 

유니티에서 시각적 효과를 구현할 수 있는 기능 중 파티클 시스템이라는 것이 있다. 

파티클 시스템은 작은 여러 이미지나 3D 오브젝트들을 이용해 불똥이나 눈, 비, 연기 등을 묘사할 수 있다.

파티클 시스템 없이는 복잡하게 구현해야하는 시각적 효과를 간단히 구현할 수 있다.

적절하게 사용할 경우 성능 면에서 크게 무리가 가지 않을 수 있지만, 그래도 이미지나 오브젝트들을 생성하는 것 이기 때문에, 많은 파티클이 한번에 생성되거나, 파티클이 복잡할 경우, 성능 저하가 발생할 수도 있다.

 

또한, 파티클 시스템 내부에 많은 옵션들이 존재하기에, 처음 이용할 경우 이러한 내용을 모두 이해하고 구현하기가 어려울 수 있다.

 

파티클 시스템에 있는 진짜 많은 옵션들

 

모든 옵션을 살펴보지는 않을 거고, 일부 옵션만 확인해볼 것이다.

 

맨 위에 있는 ImpactParticleSystem이라 되어있는 부분은, 해당 컴보넌트가 있는 오브젝트의 이름이다.

해당 옵션에서는 파티클이 반복될 것인지, 얼마나 지속될 것인지, 속도는 어느정도로 할 것인지, 크기는 어느정도로 할 것인지, 등의 파티클에 대한 대략적인 옵션들을 확인할 수 있으며, 파티클 시스템의 메인모듈에 해당된다. 

 

 

Emission은 파티클이 생성되는 방식을 제어하는데 사용되는 옵션들이다.

Rate over Time은 초당 생성되는 파티클을, Rate over Distance는 이동한 거리만큼 생성되는 파티클을 제어한다.

이번에 사용한 Bursts는 한번에 많은 양의 파티클을 생성하는 옵션이다. 

 

 

Collision은 파티클에 충돌을 부여하게 해주는 옵션이다. 예를들어 불똥이 튀는 효과의 경우, 튄 불똥이 바닥이나 벽에 부딪치는 것을 해당 옵션을 통해 구현할 수 있다.

 

 

Renderer는 파티클의 외형을 구현하는 옵션이다. Material을 통해 모양을 정할 수 있고, Order in Layer를 통해 묘사 순서를 조절 할 수 있다. 

 

하단의 코드는 파티클 시스템을 이용한 부분의 코드이다.

private void DestroyProjectile(Vector2 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);
}

 

해당 코드는 발사체가 무언가에 부딪쳐 사라질 때 파티클 효과가 나타나게 하는 코드이다.

 

발사체가 사라지는 곳으로 파티클 이펙트의 위치를 옮기고, Emission에 Burst를 추가하는 것을 확인할 수 있다.

 

SetBurst(0, new ParticleSystem.Burst(0, Mathf.Ceil(attackData.size * 5)));

은 위의 Emission 옵션에서 Bursts를 제어하는 코드이다.

 

0번에 있는 Burst에 new ParticleSystem.Burst(0, Mathf.Ceil(attackData.size * 5))를 설정한다는 뜻이다.

Burst(0, Mathf.Ceil(attackData.size * 5))에서 0은 파티클 시스템이 재생될 시간을 의미하며, 0은 즉시 재생된다는 의미이다.

Mathf.Ceil(attackData.size * 5)는 소숫점을 올림하여 정수로 만들어주는 메서드로, attackData에 있는 size의 값에 따라 파티클의 수를 더 많이 생성하게 하는 메서드이다.(예를 들어 size가 2.6인 큰 돌맹이와 0.5인 작은 돌맹이가 부딪쳤을 때 큰 돌맹이의 파티클 의 수가 더 많게 생성된다.)

 

mm.startSpeedMultiplier = attackData.size * 10f;

에서는 속도를 크기에 따라 속도를 제어하는 메서드이다.