Version: 2021.1
언어: 한국어
충돌 모듈
서브 이미터 모듈

트리거 모듈

빌트인 파티클 시스템의 트리거 모듈을 사용하면 씬에 있는 하나 이상의 콜라이더와의 상호작용을 기반으로 파티클에 액세스하고 수정할 수 있습니다. 이 모듈을 활성화하면 파티클 시스템이 연결된 스크립트에 대해 OnParticleTrigger() 콜백을 호출하며, 이를 통해 씬 내 콜라이더의 위치에 따라 파티클 리스트에 액세스할 수 있습니다.

파티클 시스템 트리거 모듈
파티클 시스템 트리거 모듈

트리거 모듈 사용

먼저 파티클이 상호작용할 수 있는 씬 내 콜라이더를 지정해야 합니다. 이렇게 하려면 Colliders 리스트 프로퍼티에 하나 이상의 콜라이더를 할당하십시오. 리스트의 콜라이더 수를 늘리려면 콜라이더 리스트 아래의 추가(+) 버튼을 클릭하고, 리스트에서 콜라이더를 제거하려면 콜라이더를 선택하고 제거(-) 버튼을 클릭하십시오. 리스트의 인덱스에 콜라이더를 아직 할당하지 않았다면 빈 항목 오른쪽에 있는 작은 추가(+) 버튼을 사용하여 새 콜라이더를 생성하고 할당할 수 있습니다. 그러면 새 게임 오브젝트가 파티클 시스템의 자식으로 생성되고, 스피어 콜라이더와 연결되고, 해당 콜라이더를 빈 항목에 할당합니다.

콜라이더를 추가한 후 특정 트리거 이벤트 타입을 전달하기 위한 조건이 충족될 때의 파티클 동작을 지정할 수 있습니다. 파티클이 콜라이더와 상호작용할 수 있는 방법을 설명하는 네 가지 이벤트 타입은 다음과 같습니다.

  • Inside: 파티클이 콜라이더의 경계 안에 있습니다.
  • Outside: 파티클이 콜라이더의 경계 밖에 있습니다.
  • Enter: 파티클이 콜라이더의 경계 안으로 들어갑니다.
  • Exit: 파티클이 콜라이더의 경계 밖으로 나갑니다.

인스펙터에는 이러한 이벤트 타입 각각에 대한 드롭다운이 있으며, 이를 통해 파티클이 트리거 이벤트의 조건을 통과할 경우에 수행하는 동작을 선택할 수 있습니다. 옵션은 다음과 같습니다.

  • Callback: OnParticleTrigger() 콜백 함수에서 파티클에 액세스할 수 있습니다.
  • Kill: 파티클을 파괴합니다. OnParticleTrigger() 콜백 함수에서 파티클에 액세스할 수 없습니다.
  • Ignore: 파티클을 무시합니다. OnParticleTrigger() 콜백 함수에서 파티클에 액세스할 수 없습니다.

OnParticleTrigger() 내에서 파티클에 액세스

트리거 이벤트 중 하나에 대한 반응으로 Callback을 선택하면 연결된 스크립트에서 이벤트 조건을 충족하는 파티클에 액세스할 수 있습니다. 이렇게 하려면 첨부된 스크립트에 OnParticleTrigger() 함수를 추가해야 합니다. 이 함수 내에서 ParticlePhysicsExtensions.GetTriggerParticles() 함수를 호출하여 트리거 이벤트의 조건을 충족하는 파티클 리스트를 가져오십시오. 이 함수는 ParticleSystemTriggerEventType을 사용하는 데, 이는 파티클을 가져올 트리거 이벤트(Inside, Outside, Enter, Exit)를 지정합니다. 또한 함수가 결과로 채우는 파티클 리스트도 가져옵니다. 리스트에서 모든 파티클에 액세스하고 수정 및 파괴할 수 있습니다. 또한 이 함수는 충돌 정보(예: 각 파티클이 트리거한 콜라이더)를 출력하는 옵션 파라미터를 사용할 수 있습니다. Collider Query Mode 프로퍼티는 이 파라미터를 통해 이용할 수 있는 정보를 제어합니다.

API 그리고 API를 사용하는 방법에 대한 자세한 내용은 아래 예제를 참조하십시오.

프로퍼티

프로퍼티 설명
Inside 파티클이 콜라이더 내에 있는 프레임마다 파티클 시스템이 파티클에 대해 수행하는 작업을 지정합니다. 다음과 같은 옵션이 있습니다.
Callback: OnParticleTrigger() 콜백에서 검색해서 가져올 수 있는 리스트에 파티클을 추가합니다.
Kill: 파티클을 파괴합니다.
Ignore: 파티클을 무시합니다.
Outside 파티클이 콜라이더 밖에 있는 프레임마다 파티클 시스템이 파티클에 대해 수행하는 작업을 지정합니다. 다음과 같은 옵션이 있습니다.
Callback: OnParticleTrigger() 콜백에서 검색해서 가져올 수 있는 리스트에 파티클을 추가합니다.
Kill: 파티클을 파괴합니다.
Ignore: 파티클을 무시합니다.
Enter 파티클이 콜라이더 범위 안으로 들어가는 프레임에서 파티클 시스템이 파티클에 대해 수행하는 작업을 지정합니다. 다음과 같은 옵션이 있습니다.
Callback: OnParticleTrigger() 콜백에서 검색해서 가져올 수 있는 리스트에 파티클을 추가합니다.
Kill: 파티클을 파괴합니다.
Ignore: 파티클을 무시합니다.
Exit 파티클이 콜라이더 범위 밖으로 나가는 프레임에서 파티클 시스템이 파티클에 대해 수행하는 작업을 지정합니다. 다음과 같은 옵션이 있습니다.
Callback: OnParticleTrigger() 콜백에서 검색해서 가져올 수 있는 리스트에 파티클을 추가합니다.
Kill: 파티클을 파괴합니다.
Ignore: 파티클을 무시합니다.
Collider Query Mode 이 파티클 시스템이 파티클이 상호작용하는 콜라이더에 대한 정보를 가져올 때 사용하는 방법을 지정합니다. 이렇게 하면 트리거 모듈 처리의 리소스 소모량이 크게 증가하므로, 추가 충돌 정보가 필요하지 않는 경우에는 이 프로퍼티를 Disabled로 설정하십시오. 다음과 같은 옵션이 있습니다.
Disabled: 각 파티클이 상호작용하는 콜라이더에 대한 정보를 가져오지 않습니다.
One: 각 파티클이 상호작용하는 첫 번째 콜라이더의 정보를 가져옵니다. 파티클이 프레임에서 여러 콜라이더와 상호작용하는 경우 파티클이 상호작용하는 Collider 리스트의 첫 번째 콜라이더를 반환합니다.
All: 각 파티클이 상호작용하는 모든 콜라이더에 대한 정보를 가져옵니다.
Radius Scale 파티클의 콜라이더 경계입니다. 이를 통해 파티클의 콜라이더 경계를 파티클의 시각적 모습에 더 가깝게 맞출 수 있습니다. 이는 파티클이 원형이고 해당 텍스처에 페이드인이 있는 경우에 유용한데, 그 이유는 파티클이 시각적으로 보이기 전에 기본 파티클 콜라이더가 트리거 내부에 있기 때문입니다. 단, 이 설정은 이벤트가 실제로 트리거될 때 변경되지 않지만, 트리거의 시각적 효과를 지연시키거나 진행시킬 수 있습니다.

1을 입력하면 파티클 콜라이더를 동일한 크기로 유지하고, 파티클이 콜라이더에 닿을 때 이벤트가 발생하는 것처럼 보입니다.
1보다 작은 값을 입력하면 파티클 콜라이더가 더 작아지고, 파티클이 콜라이더를 관통한 후 트리거가 발생하는 것처럼 보입니다.
1보다 큰 값을 입력하면 파티클 콜라이더가 더 커지고, 파티클이 콜라이더를 관통하기 전에 트리거가 발생하는 것처럼 보입니다.
Visualize Bounds 씬 뷰에서 각 파티클의 콜라이더 경계를 표시할지 여부를 나타냅니다. 이 프로퍼티를 활성화하면 콜라이더 경계를 표시하고, 비활성화하면 콜라이더 경계를 숨깁니다.

예제

콜라이더와의 상호작용

아래의 예제에서 파티클은 콜라이더 경계 안으로 진입할 때 빨간색으로 변한 다음, 콜라이더의 경계를 벗어날 때 다시 녹색으로 변합니다.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
    ParticleSystem ps;

    // these lists are used to contain the particles which match
    // the trigger conditions each frame.
    List<ParticleSystem.Particle> enter = new List<ParticleSystem.Particle>();
    List<ParticleSystem.Particle> exit = new List<ParticleSystem.Particle>();

    void OnEnable()
    {
        ps = GetComponent<ParticleSystem>();
    }

    void OnParticleTrigger()
    {
        // get the particles which matched the trigger conditions this frame
        int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
        int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);

        // iterate through the particles which entered the trigger and make them red
        for (int i = 0; i < numEnter; i++)
        {
            ParticleSystem.Particle p = enter[i];
            p.startColor = new Color32(255, 0, 0, 255);
            enter[i] = p;
        }

        // iterate through the particles which exited the trigger and make them green
        for (int i = 0; i < numExit; i++)
        {
            ParticleSystem.Particle p = exit[i];
            p.startColor = new Color32(0, 255, 0, 255);
            exit[i] = p;
        }

        // re-assign the modified particles back into the particle system
        ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter);
        ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
    }
}

이 예제의 결과는 아래 이미지를 참조하십시오.

에디터 뷰
에디터 뷰
게임 뷰
게임 뷰

여러 콜라이더와의 상호작용

다음 예제는 GetTriggerParticles() 함수에서 추출할 수 있는 추가 충돌 데이터를 활용합니다. 이로 인해 첫 번째 콜라이더의 경계 내에 있는 파티클이 빨간색으로 변하고, 두 번째 콜라이더의 경계 내에 있는 파티클이 파란색으로 변하고, 두 콜라이더 모두의 내부에 있는 파티클이 녹색으로 변합니다. 이 예제에서 Collider Query ModeAll로 설정되었습니다.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour
{
    void OnParticleTrigger()
    {
        ParticleSystem ps = GetComponent();
 
        // particles
        List inside = new List();
        List exit = new List();
 
        // get
        int numInside = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside, out var insideData);
        int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
 
        // iterate
        for (int i = 0; i < numInside; i++)
        {
            ParticleSystem.Particle p = inside[i];
            if (insideData.GetColliderCount(i) == 1)
            {
                if (insideData.GetCollider(i, 0) == ps.trigger.GetCollider(0))
                    p.startColor = new Color32(255, 0, 0, 255);
                else
                    p.startColor = new Color32(0, 0, 255, 255);
            }
            else if (insideData.GetColliderCount(i) == 2)
            {
                p.startColor = new Color32(0, 255, 0, 255);
            }
            inside[i] = p;
        }
        for (int i = 0; i < numExit; i++)
        {
            ParticleSystem.Particle p = exit[i];
            p.startColor = new Color32(1, 1, 1, 255);
            exit[i] = p;
        }
 
        // set
        ps.SetTriggerParticles(ParticleSystemTriggerEventType.Inside, inside);
        ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit);
    }
}

이 예제의 결과는 다음 이미지를 참조하십시오.

충돌 모듈
서브 이미터 모듈