빌트인 파티클 시스템의 트리거 모듈을 사용하면 씬에 있는 하나 이상의 콜라이더와의 상호작용을 기반으로 파티클에 액세스하고 수정할 수 있습니다. 이 모듈을 활성화하면 파티클 시스템이 연결된 스크립트에 대해 OnParticleTrigger() 콜백을 호출하며, 이를 통해 씬 내 콜라이더의 위치에 따라 파티클 리스트에 액세스할 수 있습니다.
이 모듈은 Particle System 컴포넌트의 일부입니다. 새로운 파티클 시스템 게임 오브젝트를 생성하거나 Particle System 컴포넌트를 기존의 게임 오브젝트에 추가하는 경우 Unity는 트리거 모듈을 파티클 시스템에 추가합니다. 기본적으로 Unity는 이 모듈을 비활성화합니다. 새로운 파티클 시스템을 생성하고 이 모듈을 활성화하려면 다음 단계를 따르십시오.
먼저 파티클이 상호작용할 수 있는 씬 내 콜라이더를 지정해야 합니다. 이렇게 하려면 Colliders 리스트 프로퍼티에 하나 이상의 콜라이더를 할당하십시오. 리스트의 콜라이더 수를 늘리려면 콜라이더 리스트 아래의 추가(+) 버튼을 클릭하고, 리스트에서 콜라이더를 제거하려면 콜라이더를 선택하고 제거(-) 버튼을 클릭하십시오. 리스트의 인덱스에 콜라이더를 아직 할당하지 않았다면 빈 항목 오른쪽에 있는 작은 추가(+) 버튼을 사용하여 새 콜라이더를 생성하고 할당할 수 있습니다. 그러면 새 게임 오브젝트가 파티클 시스템의 자식으로 생성되고, 스피어 콜라이더와 연결되고, 해당 콜라이더를 빈 항목에 할당합니다.
콜라이더를 추가한 후 특정 트리거 이벤트 타입을 전달하기 위한 조건이 충족될 때의 파티클 동작을 지정할 수 있습니다. 파티클이 콜라이더와 상호작용할 수 있는 방법을 설명하는 네 가지 이벤트 타입은 다음과 같습니다.
인스펙터에는 이러한 이벤트 타입 각각에 대한 드롭다운이 있으며, 이를 통해 파티클이 트리거 이벤트의 조건을 통과할 경우에 수행하는 동작을 선택할 수 있습니다. 옵션은 다음과 같습니다.
이 모듈이 Particle System 컴포넌트의 일부이므로 ParticleSystem 클래스를 통해 액세스합니다. 이 모듈에 액세스하고 런타임 시 값을 변경하는 방법에 대한 내용은 트리거 모듈 API 문서를 참조하십시오.
트리거 이벤트 중 하나에 대한 반응으로 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 Mode는 All로 설정되었습니다.
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);
}
}
이 예제의 결과는 다음 이미지를 참조하십시오.