본문 바로가기

프로그래밍/Unity 3D

[Unity3D] 유니티 잔상 만들기 2D 파티클로 잔상 효과 (킹오브파이터 같은)

유니티 잔상효과 만들기




킹오브파이터에서 아래처럼 필살기 등을 사용하면 보라색으로 잔상이 생기는데


유니티에서 캐릭터 이동 시에 이를 구현해보고자 하였다.


킹오브 파이터 료 필살기


처음엔 컴포넌트 중에서 Trail Renderer 를 사용해 보려고 시도했지만


위처럼 반복적으로 이미지를 렌더링 하는 기능이 아니어서 포기했다.


따라서 Particle System을 이용하기로 했다.



1. Material 생성


 Particle System에 Material을 적용하기 위해서 기존의 Object의 Sprite를 Material로 생성했다.


이때 Inspector 창에서 Shader를 Particle/Additive 로 설정해야한다.


그리고 Tint Color를 원하는 색상으로 선택한다 (위 같은경우는 보라색)


아래의 미리보기를 참고하여 설정한다.




2. Particle System 설정


 Material을 만들었으면 Particle System을 잔상을 만들고자 하는 Object 하위에 추가한다.



Particle System의 Inspector 창에서 다음과 같이 세팅해준다.



Start Lifetime 과 Max Particle, Emission 정도는


Color by Lifetime은 아래 정도로 설정해준다.


취향에 따라 Alpha값은 수정하면 된다.


이제 아래와 같이 연출이!



아직은 되지않는다. 배경이 없다면 가능할 수도 있다.


무슨 얘기냐 하면 Layer설정의 문제이다.


배경과 오브젝트와 Particle의 Sorting Layer가 Default라면


Order in Layer 를 지정해주어야한다. 


Order in Layer의 숫자가 높을 수록 위에(위에 쌓여서 먼저 보이는 것처럼) 렌더링 된다.


즉 배경이 0 파티클이 1 오브젝트가 2 이런 대소관계에 있어야한다.


물론 Sorting Layer를 추가해서 잔상과 오브젝트와 배경을 분리해 줘도 상관없지만 잔상을 아주 많이 사용할 것이 아니라면 비효율 적이라고 생각된다.


아니면 오브젝트위에 잔상을 렌더링 하고 Color by Lifetime을 조절해줘도 괜찮을 듯싶다. 아무튼 내가 선택한 방법은 Order in Layer를 변경해준것이다.



+3. 잔상 회전 Script


 왜 +를 붙였는가 하면 이작업은 TopView가 아니라면 이동간에는 굳이 해줄 필요는 없다.


물론 회전 모션이 있다면 적용해야 한다.


TopView에서 잔상을 회전시키지 않으면 이렇게 된다.



오브젝트를 따라 회전하지 않으니 별로 잔상같지가 않다.


파티클의 startRotation을 오브젝트와 동일하게 유지해주기 위해서


아래 Script를 오브젝트에 추가해 줘야한다. (Afterimage.cs)


이때 파티클의 inspector에서 startRotation은 Constatnt여야 한다. 


public class Afterimage : MonoBehaviour
{
      public ParticleSystem ps;
      void Start()
      {
            ps = GetComponentInChildren<ParticleSystem>(); 
      }
      void Update()
      {
            if (ps != null)
            {
                ParticleSystem.MainModule main = ps.main;
      
                if (main.startRotation.mode == ParticleSystemCurveMode.Constant)
                {
                    main.startRotation = -transform.eulerAngles.z * Mathf.Deg2Rad;
                }
            }
      }
}


-가 붙은 이유는 startRotation과 Obeject의 회전이 반대이기 때문이다.


여기까지 하면 깔끔하게 이동경로에 따라 킹오브파이터 필살기 같은 잔상효과가 나타난다.