유니티에서 이미지나 다양한 메쉬들을 표현하는 VFX를 표현하는 파티클로
빈 게임 오브젝트나 선택한 오브젝트에서 Add Component - particle system으로 파티클 시스템을 추가할 수있다.
Particle
파티클 시스템 (Particle System)
옵션이 많은데 사용하면서 익히면 좋을 것같다.
Duration: 지속시간
Looping :반복
Prewarm: 처음부터 방출하고 시작 or 서서히 방출
Start Delay: 시스템이 활성화된 후 파티클의 지연시간
Start Lifetime :생성되고 사라지는 시간
3D Start Size: 3D 시작 크기
Start Size: 시작 크기
Start Rotation : 시작각도
Start Color : 시작 색깔
Gravity Modifier: 중력
Simulation Space: Local / World / Custom
선택한 오브젝트를 따라서 이동하거나 World를 선택하면 월드에서 독립적으로 움직인다.
Ring buffer Mode :파티클의 최대 수치까지 파티클을 생성하고, 최대 수치까지 생성하면 가장 오래된 파티클을 재활용하여 새로 생성하고, 지속시간이 끝난 파티클을 제거한다.
파티클 생성해보기 (클릭)
화면을 클릭했을 때 파티클이 생성되는 스크립트를 만들어보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateParticle : MonoBehaviour
{
public Object[] arrParticle;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
int sel = Random.Range(0, arrParticle.Length);
Object part = arrParticle[sel];
// 파티클 게임오브젝트 생성
GameObject partObj =
(GameObject)Instantiate(part);
// ParticlePos 주변부에 파티클 생성
float x = Random.Range(-2f, 2f);
float y = Random.Range(0f, 3f);
float z = Random.Range(-2, 2f);
Vector3 pos = this.transform.position;
partObj.transform.position = new Vector3(pos.x+ x, pos.y + y, pos.z+ z);
//파티클이 발생하는 시간 이후에 파티클을 소멸시킨다
ParticleSystem ps = partObj.GetComponent<ParticleSystem>();
float duration = ps.main.duration;
Destroy(partObj, duration);
}
}
}
여러 파티클을 담을 배열과 클릭했을 때 랜덤으로 파티클을 표현해보고자 한다.
Instantiate로 파티클 게임오브젝트를 생성하여 인스턴스화하고
같은 곳이아닌 조금 다른 위치에 파티클을 만들어줄 랜덤한 위치 x, y, z좌표가 있다.
파티클 오브젝트의 파티클 시스템 컴포넌트를 저장하고 파티클 시스템의 지속시간을 저장하여
파티클 오브젝트와 지속시간이 다 되었을 때, Destroy한다.
게임 오브젝트에 닿았을 때 Trigger로 파티클 생성하기
앞서 했던 씬을 재사용한 것인데 Trigger이벤트를 이용하여 오브젝트에 닿았을 때 파티클을 만들어보자.
스크립트 역시 재사용한 것에 덧붙인 것이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerKinematic : MonoBehaviour
{
Rigidbody rb;
public Object particle;
void Start()
{
rb = this.GetComponent<Rigidbody>();
}
private void OnTriggerEnter(Collider other)
{
Debug.Log($"OnTriggerEnter - {other.name}");
switch (other.name)
{
case "Wall":
rb.isKinematic = false; // (체크해제) 닿았을 때 물리엔진 기능 on
rb.AddRelativeForce(new Vector3(0f, 200f, -200f)); // 뒤 45각도로 힘을 가함
// Particle 생성
// other로하면 벽안에 생성된다
//GameObject partObj =
// (GameObject)Instantiate(particle,
// other.transform.position, other.transform.rotation);
GameObject partObj =
(GameObject)Instantiate(particle,
this.transform.position, other.transform.rotation);
Destroy(partObj, 0.5f);
break;
}
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log($"OnCollisionEnter - {collision.collider.name}");
switch (collision.collider.name)
{
case "Floor":
rb.isKinematic = true; // 바닥에 닿았을 때 물리엔진 기능 off
break;
}
}
}
OnTriggerEnter의 case "Wall"에서 벽에 닿았을 때 파티클을 생성하는데 이때 파티클의 생성위치를 이 트랜스폼의 위치로 해주어야 한다. 만약 this.transform.position가 아닌 other.transform.postion으로 한다면 벽안에서 파티클이 생성될 것이다.