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

트리거 모듈

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

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

트리거 모듈 사용

이 모듈은 Particle System 컴포넌트의 일부입니다. 새로운 파티클 시스템 게임 오브젝트를 생성하거나 Particle System 컴포넌트를 기존의 게임 오브젝트에 추가하는 경우 Unity는 트리거 모듈을 파티클 시스템에 추가합니다. 기본적으로 Unity는 이 모듈을 비활성화합니다. 새로운 파티클 시스템을 생성하고 이 모듈을 활성화하려면 다음 단계를 따르십시오.

  1. GameObject > Effects > Particle System을 클릭합니다.
  2. 해당 인스펙터에서 Particle System 컴포넌트를 찾습니다.
  3. Particle System 컴포넌트에서 트리거 모듈 폴드아웃을 찾습니다.
  4. 폴드아웃 헤더 왼쪽에 있는 체크박스를 활성화합니다.

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

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

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

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

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

API

이 모듈은 Particle System 컴포넌트의 일부이므로 ParticleSystem 클래스를 통해 액세스합니다.이 모듈에 액세스하고 런타임 시 값을 변경하는 방법에 대한 내용은 트리거 모듈 API 문서를 참조하십시오.

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);
    }
}

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

게임 뷰
게임 뷰
충돌 모듈
서브 이미터 모듈