Làm thế nào để tôi làm cho một nhân vật có khả năng đi trên tường?


34

Tôi đang cố gắng để một nhân vật di chuyển như một con nhện: Với độ dốc tăng lên mà một quả bóng thường không thể lăn lên, con nhện sẽ từ từ bò lên.

Tương tự, được đưa ra một nền tảng hình chữ nhật giữa không trung, thay vì rơi xuống khi chạm vào rìa, con nhện sẽ tiếp tục, quấn qua mép và tiếp tục xuống bên cạnh và sau đó ở dưới nền tảng (cuối cùng đi quanh chu vi của nền tảng).

Tôi đã xem xét các thành phần Unity 2D khác nhau, với rất ít thành công. :

Hầu hết các ranh giới va chạm trong thế giới của tôi được đánh dấu bằng các thành phần Collider 2D (hoạt động tuyệt vời với một quả bóng đơn giản bị ảnh hưởng bởi trọng lực, nhưng ít hơn với nhân vật nhện này).


1
Trò chơi đó: youtube.com/watch?v=ga4Zqq1tXa8 ("Spider" trên PS1, tôi đã chơi nó từ lâu) có thể là một nguồn cảm hứng.
tigrou

Câu trả lời:


43

Tôi chuẩn bị đăng một liên kết đến blog Asteroid Base về kẻ thù Walker khi tôi nhận thấy karmington đã liên kết với bài báo Gamasutra trong một bình luận.

Mặc dù vậy, có lẽ nó đáng để đưa ra một chút khả năng hiển thị và giải thích như một câu trả lời.

Tôi đang đi trên rayhine, o-oh!

Bí quyết là phát sóng . Chúng cho phép mã của bạn quét dọc theo một dòng cho một xung đột.

Để khiến Walker thẳng hàng với các bề mặt, họ bắn hai tia xuống địa hình, một từ bên trái của Walker và một từ bên phải (đường màu đỏ và màu vàng ở trên).

Từ mỗi đối tượng RaycastHit2D, bạn có thể có được một vectơ bình thường chỉ vuông góc với bề mặt (đường màu đỏ tươi và xanh lục). Bằng cách lấy trung bình các thông số từ hai lần truy cập, bạn sẽ có được một định hướng phù hợp cho nhân vật của mình phản ánh hợp lý địa hình bên dưới (đường màu lục lam).

Bạn có thể tác dụng một lực xuống dọc theo đường định hướng này để giữ cho nhân vật bị mắc kẹt trên địa hình (mặc dù điều này có thể gây ra một số trượt nếu ma sát thấp) hoặc đặt thủ công vị trí của nhân vật tại điểm giao cắt tia trung bình như được thực hiện với Walker.

Bạn sẽ muốn pha trộn định hướng của nhân vật dần dần để giữ cho nhân vật của bạn không bị rung hoặc nhìn robot (xem cách bình thường thay đổi mạnh khi Walker đi qua góc, nhưng cơ thể di chuyển trơn tru).

Nếu bạn có các góc nhọn trong địa hình, có thể bạn sẽ muốn nghiêng các tia này vào bên trong một chút - để nếu con nhện đi qua rìa của một vách đá 90 độ, tia sáng nhô ra sẽ chạm vào mặt vách đá.

Nhóm Asteroid Base cũng bắn một tia ngắn theo hướng chuyển động của Walker (không hiển thị), ghi đè lên tia ở phía đó nếu nó chạm vào địa hình. Điều đó đảm bảo người đi bộ không bị kẹt khi đi vào góc lõm 90 độ.

Theo các tài liệu, raycast 2D khác với 3D, ở chỗ nó phát hiện các máy va chạm trong đó tia bắt đầu. Điều đó nghe có vẻ khó hiểu với tôi, nhưng nếu thử nghiệm của bạn xác nhận điều này, bạn sẽ muốn sử dụng layerMask để hạn chế các tia để chỉ phát hiện các máy va chạm địa hình có thể leo được.


Tôi có thể xác nhận rằng các sóng 2D sẽ phát hiện các máy va chạm có chứa điểm bắt đầu của raycast. Tuy nhiên, điều này có thể dễ dàng được lọc vì phát hiện đầu tiên luôn được trả về với khoảng cách bằng 0 và ngược lại bình thường với hướng của sóng.
XenoRo

2

Bạn sẽ cần mã tùy chỉnh cho việc này.

Về cơ bản, bạn cần biết đối tượng gần nhất là gì, như nền tảng đang được đề cập, sau đó tìm cạnh gần nhất và điểm gần nhất trên cạnh đó, sau đó tìm ra vị trí của con nhện và xoay từ đó.

Sẽ không dễ để làm cho nó thực sự tốt đẹp, nhưng nó sẽ là một thử thách tốt để làm cho nó hoạt động.


2
Đây là một liên kết thực sự tốt, không chắc nó có phù hợp với trường hợp của bạn không, nhưng có lẽ ... gamasutra.com/bloss/AdamWinkels/20140220/211306/ Lỗi
karmington
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.