빌트인 파티클 시스템의 트리거 모듈을 사용하면 씬에 있는 하나 이상의 콜라이더와의 상호작용을 기반으로 파티클에 액세스하고 수정할 수 있습니다. 이 모듈을 활성화하면 파티클 시스템이 연결된 스크립트에 대해 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);
}
}
이 예제의 결과는 다음 이미지를 참조하십시오.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.