Version: 2020.1
Built-in Particle System examples
차량 배기 가스 구현

단순한 폭발 구현

파티클 시스템을 사용하면 더 실감나는 폭발을 구현할 수 있지만 그 동역학은 겉으로 보는 것보다는 조금 더 복잡합니다. 근본적으로 폭발은 파티클이 밖으로 방출되는 것이지만 여기에 몇 가지를 간단하게 수정하면 폭발을 더 사실적으로 묘사할 수 있습니다.

개발 중인 파티클 시스템 폭발
개발 중인 파티클 시스템 폭발

파티클의 타임라인

단순한 폭발로 인해 모든 방향으로 빠르게 밖으로 퍼져나가는 화염구가 만들어집니다. 초반의 폭발은 높은 에너지를 가지고 있으므로 아주 뜨겁고 밝으며, 빠르게 움직입니다. 이 에너지는 빠르게 소멸되며, 따라서 화염이 퍼져나가는 속도는 느려지면서 점점 식게되고 어두워집니다. 연료가 전소되면 화염이 사그라들게 되며 곧 완전히 사라집니다.

폭발 파티클은 일반적으로 수명이 짧으며, 여기에 몇 가지 프로퍼티를 조정하여 다양한 효과를 구현할 수 있습니다. 파티클은 처음에는 아주 빠른 속도를 가지지만 폭발 중심에서 이동하면서 점점 속도가 줄어듭니다. 또한 컬러 역시 처음에는 밝지만 점점 어두워지면서 결국 투명하게 변합니다. 마지막으로 파티클의 크기를 수명 주기에 따라 줄어들도록 만들면 연료가 소진되면서 화염이 흩어지는 효과를 구현할 수 있습니다.

구현

우선 메뉴에서 게임 오브젝트(GameObject) > 효과(Effects) > 파티클 시스템(Particle System) 으로 이동하여 디폴트 파티클 시스템 오브젝트를 생성합니다. Shape 모듈로 이동하여 이미터 모양을 작은 Sphere 로 설정한 후 반지름을 0.5단위 정도로 설정합니다. 디폴트 에셋에 있는 파티클은 ParticleFireball 이라는 머티리얼을 포함하고 있는데, 이 머티리얼은 폭발을 구현하는 데 아주 적합합니다. 메뉴에서 에셋(Assets) > 패키지 임포트(Import Package) > ParticleSystems 로 이동하면 됩니다. 이 머티리얼을 시스템에 맞게 설정하려면 Renderer 모듈을 사용하면 됩니다. 폭발에서 나오는 화염은 광원을 흡수하기 보다는 방출해야 하므로 Renderer 에서 Cast ShadowsReceive Shadows 를 비활성화해야 합니다.

이 시점에서 시스템은 중심점에서 많은 수의 작은 화염구가 튀어나오는 것처럼 보입니다. 물론 폭발은 한 번에 여러 파티클을 생성해야 합니다. 이를 구현하려면 Emission 모듈에서 Rate 값을 0으로 설정한 후 최초 시점에 한 개의 파티클 Burst 를 추가하면 됩니다. 폭발의 파티클 수는 원하는 폭발의 크기와 정도에 따라 달라지지만 50개 정도의 파티클로 시험해보십시오. 폭발이 설정되었으므로 시스템은 더욱 실감나는 폭발을 구현할 수 있게 되었지만 진행 속도가 느리고 화염이 지나치게 오랜 시간 동안 머무르는 것으로 보입니다. “Explosion”과 같이 게임 오브젝트와 동일한 이름의 파티클 시스템 모듈에서 시스템의 Duration 과 파티클의 Start Lifetime 을 둘 다 2초로 설정해야 합니다.

Size Over Lifetime 모듈을 사용하면 화염이 연료를 소진하는 효과를 구현할 수도 있습니다. “ramp down” 프리셋을 사용하여 크기 커브를 설정해야 합니다. 예를 들어, 처음에는 크기가 100%로 시작하지만 0으로 줄어들도록 하면 됩니다. 화염이 점점 어두워지다가 사라지도록 하려면 Color Over Lifetime 모듈을 활성화한 후 그레디언트 왼쪽에는 흰색, 오른쪽에는 검정색을 설정해야 합니다. Fire Add 머티리얼은 렌더링을 위해 추가 셰이더를 사용하므로 컬러 프로퍼티의 어두움 또한 파티클의 투명도를 제어합니다. 따라서 컬러가 검정색으로 완전히 진행되면 화염은 완전히 투명해집니다. 또한 추가 머티리얼을 사용하면 서로 위로 중첩될 수 있도록 파티클의 밝기를 “추가”할 수 있습니다. 이렇게 하면 파티클이 전부 근접해 있으므로 폭발 초반에 더 밝은 섬광 효과를 구현할 수 있습니다.

이제 폭발은 모양을 갖추었지만 마치 우주 공간에서 발생하는 것 같다는 문제가 있습니다. 파티클이 방출되면 사라지기 전까지 긴 거리를 일정한 속도로 움직이기 때문입니다. 게임의 배경이 우주 공간이라면 이러한 효과를 의도할 수도 있겠지만 대기권에서 발생하는 폭발은 주변에 공기가 있으므로 점점 느려지고 약해집니다. Limit Velocity Over Lifetime 모듈을 활성화한 후 Speed 를 3.0 정도로 설정하고 Dampen 비율을 0.4 정도로 설정하면 폭발이 진행되면서 점점 약해지게 됩니다.

마지막으로 감안해야 할 점은 파티클이 폭발 중심에서 멀어지면 각각의 모양이 눈에 띄게 된다는 점입니다. 특히 모든 파티클이 동일한 크기를 가지고 동일하게 회전하는 경우 동일한 그래픽이 모든 파티클에 재사용되고 있다는 것을 쉽게 알아차릴 수 있습니다. 이 문제를 피하려면 파티클을 생성하면서 크기와 회전에 약간의 무작위 베리에이션을 주면 됩니다. 인스펙터 상단에 있는 파티클 시스템 모듈에서 Start SizeStart Rotation 프로퍼티 오른쪽에 있는 작은 화살표를 클릭한 후 이를 둘 다 Random Between Two Constants 로 설정해야 합니다. 회전의 경우 두 값을 완전히 임의로 회전하도록 0과 360으로 설정하고 크기의 경우 0.5와 1.5로 각각 설정하여 파티클의 크기가 지나치게 크거나 작아지지 않도록 하는 선에서 약간의 배리에이션을 주십시오. 이렇게 하면 파티클 그래픽스의 반복이 이전보다는 휠씬 눈에 띄지 않게 됩니다.

사용법

테스트 중에는 Looping 프로퍼티를 활성화하여 폭발을 반복해서 볼 수 있도록 하는 것이 유용하지만 완료된 게임의 경우 이 프로퍼티를 비활성화하여 폭발이 한 번만 발생하도록 해야 합니다. 연료 탱크와 같이 폭발할 가능성이 있는 오브젝트에 폭발을 디자인한 경우 오브젝트에 Particle System 컴포넌트를 추가할 때 Play On Awake 프로퍼티를 비활성화하는 것이 좋습니다. 이후 필요한 경우 스크립트에서 폭발시킬 수 있습니다.

    void Explode() {
            var exp = GetComponent<ParticleSystem>();
            exp.Play();
            Destroy(gameObject, exp.duration);
        }

다른 경우 충돌이 가해지는 시점에서 폭발이 발생합니다. 폭발이 수류탄과 같은 오브젝트에서 발생하는 경우 약간의 지연 시간 이후 또는 오브젝트가 타겟과 접촉한 시점에 위의 Explode 함수를 호출해야 합니다.

    // Grenade explodes after a time delay.
        public float fuseTime;

        void Start() {
            Invoke("Explode", fuseTime);
        }



        // Grenade explodes on impact.
        void OnCollisionEnter(Collision coll) {
            Explode();
        }

너무 빠르게 이동하여 보이지 않는 투사체와 같이 게임에서 실제로 표시되지 않는 오브젝트에서 폭발이 발생하는 경우 폭발을 적당한 지점에 인스턴스화하면 됩니다. 예를 들어 접점을 레이캐스트에서 결정할 수도 있습니다.

    // On the explosion object.
        void Start() {
            var exp = GetComponent<ParticleSystem>();
            exp.Play();
            Destroy(gameObject, exp.duration);
        }

    
        // Possible projectile script.
        public GameObject explosionPrefab;

        void Update() {
            RaycastHit hit;

            if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit)) {
                Instantiate (explosionPrefab, hit.point, Quaternion.identity);
            }
        }

추가 아이디어

여기서는 아주 기본적인 폭발을 만들어 보았지만, 폭발의 여러 측면을 수정하면 게임에서 표현하고자 하는 느낌을 정확하게 살릴 수 있습니다.

사용하는 파티클 그래픽에 따라 플레이어가 폭발을 “받아들이는” 방식이 크게 달라집니다. 작고 구별이 가능한 화염을 많이 사용하면 불타는 파편이 날아오는 느낌을 구현할 수 있습니다. 서로 완전히 떨어지지 않은 큰 파티클을 사용하면 파괴된 연료 탱크에서 불타오르는 불덩어리의 느낌이 납니다. 일반적으로 여러 개의 프로퍼티를 한 번에 변경해야 효과를 완전히 수정할 수 있습니다. 예를 들어 불덩어리는 꺼지기 전까지 오래 남아서 덜 퍼져야 하지만 급격한 폭발의 경우 불타는 파편이 상당히 먼 거리까지 퍼져야 합니다.

여기서는 몇 개의 프로퍼티 값만 무작위로 설정했지만 다른 프로퍼티도 Random Between Two Constants/Curves 옵션을 사용하여 다양한 방법으로 배리에이션을 추가할 수 있습니다. 크기와 회전을 다르게 설정하면 파티클의 반복이 눈에 잘 띄지 않게 되지만 Start Delay, Start Lifetime, Start Speed 프로퍼티에도 약간의 무작위성을 추가하면 좋습니다. 약간의 배리에이션을 주면 폭발이 “자연스럽게” 보이며 기계적으로 제어되는 것처럼 보이지 않고 예측 불가능한 효과를 구현할 수 있습니다. 배리에이션을 더 크게 주면 “지저분한” 폭발의 인상을 줄 수 있습니다. 예를 들어 Start Delay 에 배리에이션을 주면 폭발이 급격히 발생하는 것이 아니라 느리게 터지게 됩니다. 아마도 차량의 연료 탱크가 별도로 점화되기 때문일 수 있습니다.


  • 2017–09–19 페이지 수정됨

  • Unity 4.6에서 게임 오브젝트 메뉴 변경됨

Built-in Particle System examples
차량 배기 가스 구현