Tôi hơi không đồng ý với câu trả lời của Philipp ; hoặc ít nhất là với cách anh ấy trình bày nó. Nó mang lại ấn tượng rằng việc di chuyển thế giới xung quanh người chơi có thể là một ý tưởng tốt hơn; khi nó hoàn toàn ngược lại. Vì vậy, đây là câu trả lời của riêng tôi ...
Cả hai tùy chọn đều có thể hoạt động, nhưng nói chung là một ý tưởng tồi để "đảo ngược vật lý" bằng cách di chuyển thế giới xung quanh người chơi thay vì người chơi trên toàn thế giới.
Mất hiệu suất / lãng phí:
Thế giới thường sẽ có rất nhiều đối tượng; nhiều nếu không phải hầu hết, tĩnh hoặc ngủ. Người chơi sẽ có một, hoặc tương đối ít, các đối tượng. Di chuyển toàn bộ thế giới xung quanh người chơi, có nghĩa là di chuyển mọi thứ trong cảnh ngoại trừ người chơi. Các đối tượng tĩnh, các đối tượng động ngủ, các đối tượng động đang hoạt động, các nguồn sáng, các nguồn âm thanh, v.v; tất cả phải được di chuyển.
Điều đó (rõ ràng) đắt hơn đáng kể so với việc chỉ di chuyển những gì thực sự di chuyển (người chơi, và có thể một vài thứ nữa).
Khả năng bảo trì và mở rộng:
Di chuyển thế giới xung quanh người chơi làm cho thế giới (và mọi thứ trong đó) trở thành điểm mà mọi thứ diễn ra tích cực nhất. Bất kỳ lỗi hoặc thay đổi trong hệ thống có nghĩa là, có khả năng, mọi thứ đều thay đổi. Đây không phải là một cách tốt để làm mọi thứ; bạn muốn các lỗi / thay đổi càng tách biệt càng tốt, để bạn không gặp phải những hành vi bất ngờ ở nơi nào đó mà bạn chưa thực hiện thay đổi.
Ngoài ra còn có nhiều vấn đề khác với phương pháp này. Ví dụ, nó phá vỡ nhiều giả định về cách mọi thứ được cho là hoạt động trong động cơ. RigidBody
Chẳng hạn, bạn không thể sử dụng động cho bất kỳ thứ gì khác ngoài trình phát; vì một đối tượng có đính kèm RigidBody
không được đặt thành động học sẽ hoạt động bất ngờ khi cài đặt vị trí / xoay / tỷ lệ (mà bạn đang thực hiện mọi khung hình, cho mọi đối tượng trong cảnh, ngoại trừ người chơi)
Vậy câu trả lời là chỉ di chuyển người chơi rồi!
Chà ... có và không . Như đã đề cập trong câu trả lời của Philipp, trong một loại trò chơi dành cho người chạy vô hạn (hoặc bất kỳ trò chơi nào có diện tích rộng lớn liền mạch), đi quá xa nguồn gốc cuối cùng sẽ giới thiệu các FPPE đáng chú ý ( Lỗi chính xác nổi ), và cuối cùng, cuối cùng, tràn loại số, hoặc làm cho trò chơi của bạn bị sập, hoặc, về cơ bản, làm cho thế giới khói thuốc bị nứt ... Trên các steroid! 😵 (bởi vì thời điểm này, FPPEs sẽ làm cho trò chơi đã được trên vết nứt "bình thường")
Các thực tế giải pháp:
Làm không và làm cả hai! Bạn nên giữ thế giới tĩnh và di chuyển người chơi xung quanh nó. Nhưng "root lại" cả , người chơi và thế giới, khi người chơi bắt đầu đi quá xa gốc (vị trí [0, 0, 0]
) của cảnh.
Nếu bạn giữ vị trí tương đối của mọi thứ (người chơi với thế giới xung quanh) và thực hiện quy trình này trong một bản cập nhật khung hình duy nhất, người chơi (thực tế) thậm chí sẽ không nhận thấy!
Để làm điều đó, bạn có hai tùy chọn chính:
- Di chuyển người chơi đến gốc của cảnh và di chuyển thế giới đến vị trí mới so với người chơi.
- Hãy nghĩ về thế giới như một tấm lưới; di chuyển một phần của lưới mà người chơi đang ở gốc và di chuyển người chơi đến vị trí mới so với phần đó của lưới.
Dưới đây là một ví dụ về quá trình này đang hoạt động
Nhưng, bao xa là quá xa?
Nếu bạn xem mã nguồn của Unity, họ sử dụng 1e-5
( 0.00001
) làm cơ sở để xem xét hai giá trị dấu phẩy động "bằng nhau", bên trong Vector2
và Vector3
(các kiểu dữ liệu chịu trách nhiệm về vị trí của các đối tượng, phép quay và tỷ lệ [euler-]). Do mất độ chính xác của dấu phẩy động xảy ra cả hai cách từ 0, nên có thể giả định rằng mọi thứ nằm dưới 1e+5
( 100000
) từ gốc / gốc của cảnh đều an toàn để làm việc.
Nhưng! Từ...
- Nó thích hợp hơn để tạo ra một hệ thống để tự động xử lý các quá trình root lại này.
- Dù trò chơi của bạn là gì, không cần phải có một "khu vực" liền kề trên thế giới rộng 100000 đơn vị (mét [?]).
... sau đó có lẽ là một ý tưởng tốt để root lại sớm hơn / thường xuyên hơn 100000 đơn vị đó. Ví dụ, video tôi cung cấp dường như làm điều đó cứ sau 1000 đơn vị.