스프라이트의 후행 고 스팅 효과 만들기


15

빠르게 움직이는 스프라이트의 효과와 같은 후행 고스트를 만들고 싶습니다. 이 Sonic 이미지와 매우 유사한 것 (품질이 좋지 않은 사과, 내가 달성하고자하는 효과를 찾을 수있는 유일한 예입니다)

고스트 트레일

그러나 스프라이트 시트 수준에서 내 아틀라스의 스프라이트 양을 본질적으로 두 배 (또는 4 배)로 늘리지 않기 위해이 작업을 수행하고 싶지 않습니다. 또한 노동 집약적입니다.

이 효과를 얻을 수있는 다른 방법이 있습니까? 아마도 쉐이더 부두 마법에 의해? 도움이된다면 Unity와 2D 툴킷을 사용하고 있습니다.

답변:


21

파티클 시스템과 셰이더를 사용하면 쉽게 할 수 있습니다. 최대 3 개의 입자로 X 밀리 초마다 1 개의 입자를 방출하도록 입자 시스템을 설정하십시오. (후행 스프라이트가 얼마나 멀리 떨어져 있는지에 따라 X를 선택하십시오.) 입자의 경우 캐릭터의 현재 스프라이트와 동일한 이미지를 사용하지만 재질은 다릅니다. 머티리얼에 알파 블렌드 셰이더를 사용해 후미 입자에 원하는 효과를 얻으십시오.

더 멋진 모습을 원한다면 캐릭터의 현재 속도에 따라 최대 입자 수 및 기타 설정을 조정할 수 있습니다.

다음은 1 쿼드, 1 스프라이트, 2 재료 및 파티클 시스템으로 수행 할 수있는 예입니다.

파티클 시스템을 쿼드에 연결하고 소닉 스프라이트를 사용하도록 쿼드를 설정했습니다. 파티클 시스템의 Emission, Color over Life time 및 Renderer 설정 만 사용하고 있습니다.

최대 입자 : 5

시뮬레이션 공간 : 세계

평생 시작 : 1

시작 속도 : 0

수명에 따른 색상 : 흰색 (Alpha 255)에서 검은 색 (Alpha 0)으로 페이드

렌더러 재질 : 원본과 동일한 이미지를 사용하지만 "입자 / 알파 혼합"셰이더가 있습니다.

후행 입자 효과가있는 소닉


1
이것은 완벽하게 작동합니다. 내가 해결해야 할 유일한 것은 파티클 시스템 렌더러에서 머티리얼을 현재 스프라이트 이미지와 일치하도록 프로그래밍 방식으로 설정하는 방법입니다 (다시 말해서, 2D 툴킷을 사용하고 있기 때문에 Unity의 스프라이트 시스템과 다릅니다).
Cooper

4

파티클 시스템 솔루션과 마찬가지로 2dtoolkit을 사용하여 동일한 효과를 만들 수 있습니다. 스프라이트 만 부착 된 3 개의 어린이 게임 오브젝트를 캐릭터에 추가하십시오. 필요에 따라 알파와 색상을 변경하십시오. 그런 다음 캐릭터의 속도에 따라 스프라이트의 로컬 위치를 변경할 수 있습니다.

myTransform.localPosition = characterSpeed * distanceFactor;

파티클과 비교하여 드로우 콜을 저장하고 매끄럽게 또는 엇갈리게하려는 경우 효과의 스프레드를 완벽하게 제어 할 수 있습니다.


이것은 실제로 2D 툴킷을 사용할 때 훨씬 더 적합한 솔루션으로 이어지지 만 허용되는 답변으로 표시하는 것을 꺼려합니다. 파티클 시스템 방법은 훨씬 더 "Unity generic"방식으로 대부분의 Unity 개발자에게 가장 적합합니다. 내가 사용한 솔루션을 게시 할 것입니다.
Cooper

3

LVBen에서 제공하는 파티클 시스템 솔루션은 작동하지만 스프라이트에 2D 툴킷을 사용할 때 가장 적합한 솔루션은 아닙니다. 주된 이유는 파티클 시스템의 고스트 트레일 머티리얼을 메인 프리 팹의 현재 스프라이트 애니메이션과 동기화 할 수 없기 때문입니다.

다음은 내가 사용한 2D 툴킷 친화적 솔루션입니다.

고스트 트레일을 시작하려는 프리 팹의 경우 빈 게임 오브젝트를 부착하여 루트 역할을합니다. 이 루트 아래에서 애니메이션 오브젝트를 원하는지 여부에 따라 tk2dSprite 또는 tk2dSpriteAnimator를 원하는만큼 붙이고 게임 오브젝트를 추가하고 (4를 추가) 고스트 / 페이딩 어웨이 효과를 얻기 위해 해당 색상의 알파 값을 적절하게 조정합니다.

상위 상위 업데이트에서

// AmountToMove is a Vector3 of the amount we will translate this gameobject.
float y = (int)AmountToMove.y == 0 ? 0 : -AmountToMove.y;
float distanceFactor = 0.05f;
for (int i = 0; i < GhostingRoot.childCount; ++i) {
    // Based on the player's current speed and movement along the x and y axes,
    // position the ghost sprites to trail behind.
    Vector3 ghostSpriteLocalPos = Vector3.Lerp(
                                      GhostingRoot.GetChild(i).localPosition,
                                      new Vector3((-CurrentSpeed * distanceFactor * i),
                                                  (y * distanceFactor * i), 0),
                                      10f * Time.deltaTime);
    // GhostingRoot is the root gameobject that's parent to the ghost sprites.
    GhostingRoot.GetChild(i).localPosition = ghostSpriteLocalPos;
    // Sync the animations.
    // _ghostSprites is a List of the tk2dSpriteAnimator ghost sprites.
    _ghostSprites[i].Play(SpriteAnimator.CurrentClip.name);
    _ghostSprites[i].Sprite.FlipX = Sprite.FlipX;
}

이 솔루션은 고스트 스프라이트의 애니메이션을 메인 스프라이트와 동기화하면서 후행 고 스팅 효과를 만듭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.