Tạo một hiệu ứng kéo dài, bóng mờ của một sprite


15

Tôi muốn tạo ra một dấu vết, bóng ma giống như hiệu ứng của một sprite đang di chuyển nhanh. Một cái gì đó rất giống với hình ảnh này của Sonic (lời xin lỗi có chất lượng kém, đó là ví dụ duy nhất tôi có thể tìm thấy về hiệu ứng mà tôi đang mong muốn đạt được)

Con đường ma

Tuy nhiên, tôi không muốn làm điều này ở cấp độ sprite, để tránh phải tăng gấp đôi (hoặc có thể gấp bốn lần) số lượng sprite trong tập bản đồ của tôi. Nó cũng rất tốn công sức.

Vì vậy, có cách nào khác để đạt được hiệu ứng này? Có thể bởi một số ma thuật shader voodoo? Tôi đang sử dụng Unity và 2D Toolkit, nếu điều đó có ích.

Câu trả lời:


21

Bạn có thể dễ dàng làm điều này với một hệ thống hạt và một shader. Thiết lập hệ thống hạt để giải phóng 1 hạt mỗi X mili giây với tối đa 3 hạt. (Chọn một chữ X dựa trên khoảng cách mà bạn muốn các sprite theo dõi cách nhau.) Đối với hạt, sử dụng cùng một hình ảnh như sprite hiện tại của nhân vật, nhưng với một vật liệu khác. Hãy thử một số shader pha trộn alpha trên vật liệu để có được hiệu ứng mà bạn muốn trên các hạt trailing.

Nếu bạn muốn nhận fancier, bạn có thể điều chỉnh số hạt tối đa và các cài đặt khác dựa trên tốc độ hiện tại của nhân vật.

Dưới đây là một ví dụ mà tôi có thể làm chỉ với 1 Quad, 1 sprite, 2 vật liệu và hệ thống hạt.

Tôi gắn hệ thống hạt vào Quad và đặt quad để sử dụng Sonic sprite. Tôi chỉ sử dụng các cài đặt Phát xạ, Màu theo thời gian và Kết xuất của Hệ thống Hạt.

Các hạt tối đa: 5

Không gian mô phỏng: Thế giới

Bắt đầu trọn đời: 1

Tốc độ bắt đầu: 0

Màu trong suốt cuộc đời: Làm mờ dần từ Trắng (Alpha 255) sang Đen (Alpha 0)

Chất liệu kết xuất: Sử dụng cùng một hình ảnh như bản gốc, nhưng với trình đổ bóng "Hạt / Alpha Blended".

Sonic với hiệu ứng hạt Trailing


1
Điều này hoạt động hoàn hảo. Điều duy nhất tôi cần làm là làm thế nào để lập trình vật liệu trên trình kết xuất hệ thống hạt để phù hợp với hình ảnh sprite hiện tại (một lần nữa, tôi đang sử dụng Bộ công cụ 2D để nó khác với hệ thống sprite của Unity).
Cooper

4

Giống như giải pháp hệ thống hạt, bạn có thể sử dụng 2dtoolkit để tạo hiệu ứng tương tự. Thêm 3 đối tượng trò chơi trẻ em vào nhân vật chỉ với một sprite gắn liền với chúng. Thay đổi alpha và tô màu khi cần thiết. Sau đó, bạn có thể thay đổi vị trí cục bộ của sprite tùy thuộc vào tốc độ của nhân vật:

myTransform.localPosition = characterSpeed * distanceFactor;

Nó lưu một cuộc gọi rút thăm (so với các hạt) và cung cấp cho bạn toàn quyền kiểm soát sự lan rộng của hiệu ứng, nếu bạn muốn thực hiện nó trơn tru hoặc so le.


Điều này thực sự dẫn tôi đến một giải pháp tốt hơn phù hợp hơn nhiều khi sử dụng Bộ công cụ 2D, nhưng tôi miễn cưỡng đánh dấu là câu trả lời được chấp nhận. Phương pháp hệ thống hạt là một cách "Unity generic" hơn nhiều có lẽ phù hợp nhất với hầu hết các nhà phát triển Unity. Tôi sẽ đăng giải pháp tôi đã sử dụng.
Cooper

3

Mặc dù giải pháp hệ thống hạt do LVBen cung cấp không hoạt động, nhưng đó không phải là giải pháp phù hợp nhất khi sử dụng Bộ công cụ 2D cho các họa tiết của bạn. Lý do chính là không thể đồng bộ hóa vật liệu đường mòn ma trong hệ thống hạt với hoạt hình sprite hiện tại của prefab chính.

Đây là giải pháp thân thiện với Bộ công cụ 2D mà tôi đã sử dụng.

Đối với prefab mà bạn muốn xuất hiện dấu vết ma, hãy đính kèm một đối tượng trò chơi trống vào đó để đóng vai trò là gốc. Trong thư mục gốc này, đính kèm bất kỳ số lượng tk2dSprite hoặc tk2dSpriteAnimator (tùy thuộc vào việc bạn có muốn các họa tiết hoạt hình hay không) (tôi đã thêm 4) và điều chỉnh các giá trị alpha màu của chúng sao cho phù hợp để đạt được hiệu ứng bóng mờ / mờ dần.

Trong bản cập nhật cha mẹ hàng đầu

// 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;
}

Giải pháp này sẽ tạo ra hiệu ứng bóng ma kéo dài trong khi đồng bộ các hình ảnh động của các sprite ma với sprite chính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.