본문 바로가기

C#/게임 제작 + TIL

Particle System - 잔상 효과

이번 주 팀 프로젝트는 건전, 바인딩 오브 아이작과 같은 탑다운 뷰의 슈팅 게임을 만들게 되었다.

몬스터의 행동 패턴의 설계와 구현에 흥미를 느끼고 더 집중하고 싶었기 때문에 이번 팀 프로젝트에서는 FSM을 활용한 전체 몬스터의 구현을 맡게 되었다.

 


일반 몬스터의 구현이 끝난 이후, 보스 몬스터의 이전 간간히 조우하게 될 엘리트 몬스터를 제작하고 있었고, 수량으로 밀어붙이는 일반 몬스터와는 다르게 약간의 긴장감을 주는 패턴을 넣고 싶었기 때문에, 빠른 속도감과 반응속도를 요구하게 하는 대시 스킬을 넣고자 하였다.

 

 

 

또한 게임에 대쉬를 넣는다면, 이러한 잔상 효과를 주어 시각적인 정보가 동반된다면 더 긴장감 있고 즉각적인 피드백이 가능할 것으로 생각했기에 아래와 같이 파티클 시스템을 이용해서 구현해 보았다.

 


 

 

마테리얼의 경우 먼저 이번 프로젝트 에서는 빌트인 렌더 파이프 라인만 사용하기에 레거시 쉐이더를 이용하여 구현하였고. 쉐이더는 Legacy Shaders/Particles/Alpha Blended로 선택해, 보라색 색상을 넣어주었다.

 

 

 

다음은 파티클 시스템 컴포넌트의 설정으로, 빈 게임 오브젝트를 몬스터 오브젝트의 자식에 넣어준 뒤 파티클 시스템 컴포넌트를 넣어 주었다.

이후,  Start Lifetime, Start Speed, Simulation Space, Emission 등의 자연스럽게 보이기 위한 조건 활성화와 수치 조정을 해 주었고, 렌더러 부분에 마테리얼을 적용해 주었다.

 

파티클 시스템 컴포넌트
파티클 시스템 렌더러

 

 

다음은 해당 파티클이 대쉬를 사용하는 시점에서만 활성화가 되어야 하기에 이에 맞는 코드를 작성해 주었다.

void Dash()
{
    if(target == null) return;
    if(monsterState == MonsterState.Move && Vector2.Distance(transform.position,target.transform.position) <= dashRange)// 이동 상태에서만 대쉬 가능.
    {
        dashCoolTime = 8f;
        monsterState = MonsterState.Idle;
        transform.DOMove(target.transform.position, 0.5f)
            .OnStart(() => sandevistanParticle.gameObject.SetActive(true))
            .OnComplete(() =>
            {
                sandevistanParticle.gameObject.SetActive(false);
                monsterState = MonsterState.Move;
            });
    }
}

 

 

 


 

 

이렇게 해 준뒤 기본적인 FSM이 설정된 몬스터 오브젝트를 테스팅하면 아래와 같은 결과물이 나온다.