Tôi muốn xem liệu tôi có thể kéo nó ra mà không cần tự động tái tạo lưới cho thác nước mỗi khung hình. Hóa ra, có một cách. : D
Mỗi đối tượng có thể chặn thác nước (các đối tượng mang WaterCatcher
tập lệnh trong nguyên mẫu của tôi) có một lưới phác thảo bao quanh chu vi của nó. (Điều này có thể được tạo tự động trước bằng cách sử dụng hình dạng của máy va chạm)
Lưới phác thảo này làm cho nước chảy dọc theo vật thể. Tôi sử dụng một shader để tạo clip
ra phần bên dưới đối tượng. Tôi cũng theo dõi một điểm "bắt" bên trái và bên phải nơi một thác nước đổ vào vật thể và chảy sang trái hoặc phải tương ứng, vì vậy tôi có thể clip
thoát ra phần bên trái của thác nước bên phải và bên phải thác nước bên trái.
Sau đó, thác thẳng đứng chỉ là tứ nguyên cơ bản, được kéo dài đến độ dài thích hợp. Tôi sử dụng một shader khác để cuộn kết cấu thác nước qua thác và làm mờ nó ở đầu & cuối. Sau đó, tôi lớp trên một hệ thống hạt bọt tại điểm va chạm để giúp che phủ hỗn hợp.
Đây là một cận cảnh để bạn có thể thấy các bộ phận thành phần.
Ở trên đỉnh tôi có một thác nước "gốc" để khởi động mọi thứ. Mỗi khung hình, sau khi tất cả các Update()
tập lệnh đã chạy để di chuyển mọi thứ xung quanh, nó bắn CircleCast
xuống phía dưới, để xem liệu nước của nó có chạm vào thứ gì không. Nếu nó chạm a WaterCatcher
, nó bảo nó hiển thị vùng nước phía dưới của điểm nhấn.
Tôi xác định "hạ lưu" bằng cách sử dụng cú đánh bình thường - nếu nó rất gần với phương thẳng đứng hoặc nếu thác nước chảy qua các cạnh có độ dốc theo cả hai hướng, thì chúng ta sẽ đổ cả trái và phải.
Mỗi cái WaterCatcher
có một thác bên trái và bên phải của riêng nó, nó cho phép và đặt ở vị trí xa của nó nếu nó tràn theo hướng đó - nếu không chúng sẽ bị ẩn. Những thác nước này lần lượt bắn CircleCast
xuống để tìm thấy những gì chúng tràn vào, và cứ thế ...
Nguyên mẫu vẫn có một vài trục trặc hình ảnh có thể được cải thiện - dòng nước dọc theo một vật thể bật lên cùng một lúc thay vì hoạt hình, và các quy tắc dòng chảy có thể sử dụng thêm một chút dung sai hoặc độ trễ để nó không bị cắt dễ dàng vật quay. Tôi nghĩ rằng đây là những vấn đề khá giải quyết được mặc dù.
Bối cảnh, đá và kết cấu nền tảng xoay qua Kenney
Dưới đây là các thủ thuật tôi sử dụng trong trình tạo mảnh bắt nước:
// My wraparound geometry is build so the "x+" UV direction
// points "outward" from the object.
// Using derivatives, I can turn this into a vector in screen space.
// We'll use this below to clip out water hanging off the bottom.
float2 outward = float2(ddx(i.uv.x), ddy(i.uv.x));
// i.worldX is the worldspace x position of this fragment
// (interpolated from the vertex shader)
// _LeftX is a material property representing the worldspace x coordinate
// of the rightmost water flow that's spilling left,
// and _RightX the wold x of the leftmost water flow that's spilling right.
float left = _LeftX - i.worldX; // +ve if we're to the left of a left spill.
float right = i.worldX - _RightX; // +ve if we're to the right of a right spill.
float limit = max(left, right); // +ve if we're in the path of either flow.
// If the "outward" vector is pointing down, make this negative.
limit = min(limit, outward.y + 0.001f);
// If any of the conditions above make limit <= 0, abort this fragment.
clip(limit);
// Otherwise, scroll the water texture!
// Counter-clockwise if we're in the left flow, clockwise otherwise.
i.uv.y -= sign(left) * _Time.y;