Trong trò chơi nhiều người chơi, máy khách cần được đồng bộ hóa. Bạn có thể trao đổi gói dữ liệu trực tiếp từ phương tiện truyền tải của mình, nhưng điều này có thể phức tạp đối với các nhà phát triển có ít kinh nghiệm. Vì vậy, hãy xem xét một số giải pháp mạng được tạo sẵn cho mọi trường hợp sử dụng.
Xin chào! Tôi là Dmitrii Ivashchenko, Kỹ sư phần mềm chính tại MY.GAMES. Chuỗi bài viết của chúng tôi về bối cảnh nhiều người chơi trong thời gian thực của Unity vào năm 2023 vẫn tiếp tục! Chủ đề hôm nay liên quan đến các giải pháp có sẵn dành cho nhiều người chơi trong thời gian thực hiện có sẵn cho chúng tôi. Bắt đầu nào.
Trong trò chơi nhiều người chơi, máy chủ và máy khách trao đổi dữ liệu bằng cách gửi các gói qua mạng. Để tạo không gian ảo chung cho những người chơi đang kết nối từ các vị trí khác nhau, các sự kiện trong quá trình trò chơi (như chuyển động của nhân vật hoặc tạo đối tượng) sẽ được đồng bộ hóa với các máy khách khác bằng cách gửi cho họ các gói dữ liệu. Bên chịu trách nhiệm gửi và nhận các gói qua mạng được gọi là lớp vận chuyển.
Về mặt lý thuyết, bạn có thể gửi các gói này bằng cách gọi trực tiếp các chức năng gửi của phương tiện truyền tải của mình, cách tiếp cận này có thể nhanh chóng trở nên bất tiện đối với các nhà phát triển có ít kinh nghiệm làm việc với trò chơi nhiều người chơi. Vì vậy, tốt hơn hết bạn nên sử dụng một trong những danh sách được liệt kê bên dưới, thay vì tự viết từ đầu. Hãy xem xét những giải pháp đó.
Unity cung cấp hai gói Netcode: Netcode cho GameObjects (trong giai đoạn phát hành xem trước), Netcode cho các thực thể (ở chế độ thử nghiệm) và UNET không được dùng nữa. Nó cũng cung cấp dịch vụ Unity Relay để kết nối các máy khách trò chơi - hãy chạm vào vấn đề đó ngay bây giờ.
Unity Relay là cách để các nhà phát triển trò chơi cung cấp khả năng kết nối nâng cao giữa những người chơi thông qua cơ chế mã tham gia mà không cần đầu tư vào giải pháp của bên thứ ba, duy trì máy chủ trò chơi chuyên dụng (DGS) hoặc lo lắng về độ phức tạp của mạng trong trò chơi nhiều người chơi. Thay vì sử dụng DGS, dịch vụ Relay cung cấp kết nối thông qua máy chủ Relay phổ quát, hoạt động như một proxy.
Dịch vụ Chuyển tiếp cho phép người chơi giao tiếp qua nhiều giao thức khác nhau, bao gồm UDP, DTLS và WebSocket bảo mật (WSS). Sau khi chọn máy chủ Rơle, máy khách liên lạc trực tiếp với máy chủ Rơle bằng một trong các giao thức nói trên. Kết nối WebSocket cho phép kết nối nhiều người chơi trong các trình duyệt sử dụng WebGL.
Relay hỗ trợ làm việc với bất kỳ game engine nào. Nếu bạn đang sử dụng Relay với Unity, cách tốt nhất là sử dụng SDK Relay, được tích hợp với Unity Transport Package (UTP).
Unity Transport là thư viện mạng cấp thấp để phát triển trò chơi nhiều người chơi. Nó củng cố Netcode cho GameObjects và Netcode cho các thực thể, nhưng bạn cũng có thể sử dụng nó với giải pháp của mình.
Unity Transport hỗ trợ dễ dàng tất cả các nền tảng được Unity Engine hỗ trợ, nhờ lớp trừu tượng dựa trên kết nối (trình điều khiển mạng tích hợp) được cung cấp trên UDP và WebSockets. Bạn có thể định cấu hình UDP và WebSockets có hoặc không có mã hóa. Bạn cũng có thể sử dụng quy trình để có được chức năng bổ sung như độ tin cậy, thứ tự gói và phân mảnh gói.
Các tính năng chính của Transport 2.0 bao gồm hỗ trợ bổ sung cho WebGL; điều này cho phép sử dụng gói Unity Transport trên tất cả các nền tảng được Unity Engine hỗ trợ. Người dùng truyền tải hiện có quyền truy cập vào việc triển khai truyền tải Websocket của chúng tôi, có hoặc không có TLS. Người chơi đang di chuyển giờ đây có thể tận dụng lợi thế của việc di chuyển mạng minh bạch, điển hình là giữa các tháp di động. Tính năng này hiện bị giới hạn ở phía máy khách và đối với việc truyền tải UDP.
Để hoạt động với Unity Transport, bạn cần cài đặt Unity Editor phiên bản 2022.2 trở lên, đồng thời cài đặt gói com.unity.transport
.
Rơle hoạt động với Unity Transport (UTP), cho phép khách hàng kết nối mà nếu không sẽ không thể giao tiếp do các hạn chế định tuyến, chẳng hạn như tường lửa nghiêm ngặt.
Rơle có những hạn chế sau:
Bất chấp những hạn chế, dịch vụ Relay là một công cụ mạnh mẽ để đơn giản hóa kết nối người chơi và mang lại trải nghiệm chơi game nhiều người chơi mượt mà.
Hai trong số các giải pháp phổ biến nhất cho mã mạng trò chơi chính của Relay bao gồm Netcode cho GameObjects (NGO) và API Mirror Networking.
Cách tốt nhất được khuyến nghị là sử dụng NGO (trong hầu hết các trường hợp) vì nó cung cấp một bộ tính năng cốt lõi ổn định như biến mạng, quản lý cảnh, cuộc gọi thủ tục từ xa (RPC) và nhắn tin. Tuy nhiên, với sự đơn giản và dễ sử dụng, API Mirror Networking cũng rất phù hợp cho các trò chơi không yêu cầu bộ tính năng hoàn chỉnh do NGO cung cấp.
Photon Realtime là lớp cốt lõi cho các trò chơi nhiều người chơi (và các giải pháp mạng phức tạp hơn từ Photon). Nó giải quyết các vấn đề như mai mối người chơi và giao tiếp nhanh bằng cách sử dụng phương pháp có thể mở rộng. Photon Realtime được sử dụng cả trong trò chơi và các giải pháp nhiều người chơi cụ thể hơn.
Photon Realtime không bao gồm các cơ chế đồng bộ hóa trạng thái trò chơi và mô phỏng giống như các cơ chế được tìm thấy trong các giải pháp Fusion hoặc Quantum mà thay vào đó tập trung vào việc truyền tải thông điệp qua mạng.
Thuật ngữ Photon Realtime cũng bao gồm khuôn khổ API, công cụ và dịch vụ mở rộng của chúng tôi, xác định sự tương tác giữa máy khách và máy chủ.
Tất cả các máy khách Photon Realtime kết nối với một chuỗi các máy chủ chuyên dụng, được chia thành ba nhiệm vụ riêng biệt: xác thực và phân phối khu vực (Máy chủ tên), kết nối người chơi (Máy chủ chính) và chơi trò chơi (Máy chủ trò chơi). Tất cả các máy chủ này đều được quản lý thông qua API thời gian thực, do đó bạn không cần phải lo lắng về chúng — mặc dù kiến thức về chúng chắc chắn có thể hữu ích.
Photon Cloud là dịch vụ được quản lý hoàn toàn, cung cấp dịch vụ lưu trữ toàn cầu cho khách hàng Photon Realtime. Mã trò chơi giao tiếp với Photon Cloud, kết nối với đám mây và sử dụng API của nó để thực hiện các hành động như kết nối, tham gia một phòng ngẫu nhiên hoặc gây sự kiện.
Trong Photon Realtime, dữ liệu phòng có thể được lưu và tải dễ dàng, đồng thời có thể thiết lập webhook để kết nối Photon Cloud với máy chủ web bên ngoài.
Photon Fusion là thư viện hiệu suất cao mới để đồng bộ hóa trạng thái mạng cho Unity. Nó hỗ trợ hai cấu trúc liên kết mạng khác nhau về cơ bản và một chế độ dành cho một người chơi không cần kết nối mạng bằng một API duy nhất.
Fusion được thiết kế với mục đích đơn giản hóa để tích hợp vào quy trình làm việc của Unity và cung cấp các tính năng nâng cao như nén dữ liệu, dự đoán phía máy khách và bù độ trễ "ngay lập tức".
Ví dụ: trong Fusion, RPC và trạng thái mạng được xác định bởi các thuộc tính trên các phương thức và thuộc tính MonoBehaviour
mà không cần mã tuần tự hóa rõ ràng và các đối tượng mạng có thể được xác định là prefab, sử dụng tất cả các tính năng prefab mới nhất của Unity.
Fusion sử dụng thuật toán nén hiện đại để giảm yêu cầu về băng thông với chi phí tối thiểu trên bộ xử lý. Dữ liệu được gửi dưới dạng ảnh chụp nhanh được nén hoàn toàn hoặc dưới dạng khối một phần với tính nhất quán sau đó đạt được. Trong trường hợp thứ hai, hệ thống khu vực sở thích có thể tùy chỉnh hoàn toàn được cung cấp, cho phép số lượng người chơi rất lớn.
Fusion triển khai mô phỏng dựa trên đánh dấu và hoạt động ở chế độ Chia sẻ hoặc chế độ Máy chủ. Sự khác biệt chính là ai có quyền đối với các đối tượng mạng, nhưng điều này lại xác định những tính năng SDK nào khác có sẵn.
Fusion được phát triển để thay thế hai sản phẩm Photon hiện có cho Unity (Bolt và PUN). Các thành phần cốt lõi quan trọng của Fusion là NetworkRunner
và NetworkObject
. NetworkRunner
có thể được coi là cốt lõi của Fusion - có một Á hậu quản lý các hoạt động và mô phỏng mạng.
Fusion cung cấp nhiều NetworkBehaviours
dựng sẵn khác nhau để tạo trò chơi hoặc nguyên mẫu nhanh chóng.
Fusion tách quá trình xử lý đầu vào thành hai bước: thu thập đầu vào từ phần cứng cục bộ và đặt nó vào một cấu trúc, sau đó đọc đầu vào đó để thay đổi trạng thái trò chơi (tăng cường mô phỏng).
Fusion hỗ trợ RPC (Cuộc gọi thủ tục từ xa) cho các trường hợp đầu vào Fusion tiêu chuẩn hoặc việc sử dụng thuộc tính [Networked]
không phải là giải pháp thiết thực nhất. Để bắt đầu với Fusion, chúng tôi khuyên bạn nên nghiên cứu Hướng dẫn bắt đầu Fusion.
Photon Quantum là một công cụ hoàn toàn xác định cho các trò chơi nhiều người chơi. Nó dựa trên phương pháp dự đoán/khôi phục, hoàn hảo cho các trò chơi trực tuyến nhạy cảm với độ trễ, chẳng hạn như game nhập vai hành động, game thể thao, game đối kháng, FPS, v.v.
Khi sử dụng công cụ này, không cần mã mạng; tất cả các yếu tố trò chơi được nối mạng theo mặc định và được đồng bộ hóa 100%. Bạn chỉ cần tạo một mô phỏng với nhiều người chơi được kết nối, như khi phát triển trải nghiệm nhiều người chơi cục bộ. Các hệ thống con xác định của Quantum đảm bảo rằng các mô phỏng trên mỗi máy khách luôn được đồng bộ hóa và không có độ trễ, bao gồm: vật lý, bot, tìm đường, hoạt hình.
Trò chơi xác định vốn có khả năng chống gian lận. Cuộc chiến chống gian lận được thực hiện bằng cách kiểm tra các bản phát lại hoặc mô phỏng máy chủ đánh giá (biện pháp chống gian lận hiệu quả nhất).
Đầu vào của người chơi được gửi đến máy chủ Photon Cloud và sau đó được phân phối cho những người chơi khác. Webhooks có thể được sử dụng để kết nối phần phụ trợ và plugin của riêng bạn để thực thi mã tùy chỉnh ở phía máy chủ.
Photon Quantum được xây dựng trên kiến trúc ECS và được khẳng định là có hiệu suất cao để chạy ngay cả những trò chơi nhiều người chơi đòi hỏi nhiều về thể chất trên PC, bảng điều khiển, VR và điện thoại di động.
Mô phỏng được mã hóa trong Quantum không phụ thuộc vào Unity và có thể chạy ở mọi nơi. Tất cả các hành động cục bộ được thực hiện không chậm trễ và các đầu vào từ xa được dự đoán và khôi phục. Quantum có khả năng xem replay. Các bản phát lại có thể được lưu ở phần phụ trợ hoặc được sử dụng trong trò chơi. Để bắt đầu, bạn có thể xem dòng Quantum 100.
Normcore là một công cụ hiệu suất cao để thêm chế độ nhiều người chơi vào bất kỳ dự án dựa trên Unity nào. Normcore bao gồm vật lý mạng, không gian cố định, trò chuyện thoại và hỗ trợ XR.
Normcore tự động đồng bộ hóa tất cả các phép biến đổi đối tượng khi bạn thêm thành phần RealtimeTransform
vào nó. Điều này không yêu cầu bất kỳ mã hóa. Ngoài ra, Normcore còn cung cấp phép nội suy phụ thuộc vào trạng thái và vật lý mạng đáng tin cậy để chuyển động hoàn hảo trong mọi kết nối.
Một trong những ưu điểm chính của Normcore là truyền dữ liệu nhanh dựa trên WebRTC. Nó sử dụng kích thước gói tối đa không gây phân mảnh trong quá trình truyền, giúp tăng tốc quá trình truyền dữ liệu. Tất cả các gói dữ liệu trong Normcore đều được mã hóa mặc định, đảm bảo tính an toàn, bảo mật dữ liệu của người dùng.
Normcore cũng sử dụng hệ thống cập nhật delta. Điều này có nghĩa là nó theo dõi tất cả các thay đổi kể từ khi gói cuối cùng được gửi và khi đến lúc gửi gói mới, nó đã biết những gì cần bao gồm trong đó. Điều này tiết kiệm tài nguyên và cải thiện hiệu suất. Tính năng tuần tự hóa dữ liệu trong Normcore cho phép tối ưu hóa việc sử dụng CPU. Tất cả mã tuần tự hóa được tạo tự động trước khi biên dịch dự án, đảm bảo sử dụng tài nguyên nhanh chóng và hiệu quả.
Máy chủ Normcore hoạt động ở các khu vực trên toàn thế giới và được kết nối thông qua mạng cáp quang riêng, mang lại độ trễ thấp. Bạn có thể lưu trữ Normcore trên máy chủ của riêng mình hoặc cho phép Normcore lưu trữ bản sao riêng tư của cơ sở hạ tầng đám mây của chúng tôi cho bạn.
Mirror Networking là thư viện mạng cấp cao dành cho Unity, được tối ưu hóa để dễ sử dụng và độ tin cậy. Thư viện này được thiết kế để đơn giản hóa quá trình làm việc với các kết nối mạng, cho phép các nhà phát triển tập trung vào việc tạo dự án của họ.
Mirror Networking tương thích với hơn chục giao thức cấp thấp và không ngừng phát triển và cải tiến. Nó bao gồm các tính năng cho các cuộc gọi thủ tục từ xa và quản lý ngữ cảnh qua mạng, đồng thời cũng hỗ trợ làm việc với vật lý trong các ứng dụng nối mạng.
Thư viện cung cấp hơn chục bộ điều hợp mạng tích hợp và năm tùy chọn hệ thống quản lý mạng, cho phép các nhà phát triển tạo các phiên bản tùy chỉnh. Một số ví dụ sử dụng hoàn chỉnh cũng được đưa vào để tạo điều kiện thuận lợi cho quá trình học tập và viết mã.
Nakama của Heroic Labs là một máy chủ trò chơi mã nguồn mở phổ biến cho phép bạn sở hữu toàn bộ cơ sở hạ tầng của mình trong một gói mở. Nakama bao gồm tất cả các API chơi game thời gian thực cần thiết cũng như các tính năng xã hội và cạnh tranh.
Được trang bị tất cả các tính năng cần thiết cho trò chơi của bạn, chẳng hạn như nhiều người chơi trong thời gian thực cũng như các chức năng xã hội và cạnh tranh, Nakama cho phép bạn tùy chỉnh tất cả các khía cạnh cả trên máy khách và phía máy chủ bằng cách sử dụng Go, TypeScript và Lua. Với Nakama, bạn có thể tạo các trò chơi cạnh tranh nhiều người chơi trong thời gian thực, tùy chỉnh thuật toán mai mối, thêm phần thưởng hàng ngày, tạo bảng xếp hạng, triển khai tiền tệ trong trò chơi và cung cấp trò chuyện theo thời gian thực.
Fish-Networking là thư viện mã nguồn mở miễn phí dành cho các giải pháp mạng trong Unity, được phát triển bởi một nhà thiết kế trò chơi có kinh nghiệm. Nó cung cấp một bộ tính năng phong phú thường chỉ có ở các giải pháp trả phí.
Ưu điểm chính của Fish-Networking là tối ưu hóa băng thông và tài nguyên (có thể tiết kiệm chi phí máy chủ), hỗ trợ số lượng lớn người chơi (từ hàng chục đến hàng trăm) và các tính năng tích hợp như dự đoán máy khách, bù độ trễ, tải máy chủ cân bằng và hỗ trợ các đối tượng mạng lồng nhau.
Bảng sau đây cung cấp thông tin tổng quan về các giải pháp mạng khác nhau để phát triển trò chơi trên Unity, so sánh chúng theo các giao thức được sử dụng, cấu trúc liên kết được hỗ trợ, số lượng người chơi tối đa mỗi phiên, phiên bản Unity được hỗ trợ tối thiểu và trạng thái hiện tại tính đến giữa năm 2023.
Giải pháp | Giao thức | Cấu trúc liên kết | Tối đa. người chơi mỗi phiên | Phiên bản Min Unity | Trạng thái |
---|---|---|---|---|---|
Netcode cho các thực thể | UDP, WebSockets | Unity Relay, P2P, Máy khách được lưu trữ, DGS | 100 (Giới hạn của Unity Relay) | 2022.3 | 🧪 Thử nghiệm |
Mã mạng cho GameObjects | UDP, WebSockets | Rơle (qua Unity Relay), P2P, Máy khách được lưu trữ, DGS | 100 (Giới hạn của Unity Relay) | 2021.3 | ℹ️ Trước khi phát hành |
Photon thời gian thực | UDP, TCP, HTTP hoặc WebSockets đáng tin cậy | Rơle (qua đám mây Photon), DGS | 32 | 2018.4 | ✅ Sẵn sàng sản xuất |
Sự kết hợp Photon | TCP, RUDP, WebSockets | Rơle (qua Đám mây Photon), P2P, Máy khách được lưu trữ, DGS | 200 | 2020.3 | ✅ Sẵn sàng sản xuất |
lượng tử photon | RUDP | Rơle (qua Đám mây Photon) | 32 | 2018.4 | ✅ Sẵn sàng sản xuất |
tiêu chuẩn | WebRTC qua UDP và TCP | Chuyển tiếp (qua đám mây Normcore) | 100 | 2020 LTS | ✅ Sẵn sàng sản xuất |
Mạng nhân bản | KCP , WebSockets | Máy khách được lưu trữ, DGS, P2P, Rơle | 200 | 2020 LTS | ✅ Sẵn sàng sản xuất |
Nakama | RUDP | Chuyển tiếp , có thẩm quyền , được lưu trữ trên máy khách | Bị giới hạn bởi hiệu suất máy chủ | 2018.4 | ✅ Sẵn sàng sản xuất |
Lưới Cá | RUDP, WebSockets | Rơle, P2P, DGS | 200 | 2019.4 | ✅ Sẵn sàng sản xuất |
Photon PUN | UDP, TCP, WebSockets | DGS, Rơle, P2P, Máy khách được lưu trữ | 32 | 2019.4 | ⚠️ Không dùng nữa |
bu-lông photon | UDP, TCP | P2P, DGS | 50 | 2019.4 | ⚠️ Không dùng nữa |
UNET | TCP, UDP | Khách hàng lưu trữ, DGS | Bị giới hạn bởi hiệu suất máy chủ | 5.1 | ⚠️ Không dùng nữa |
Sự đa dạng của các giải pháp có sẵn cho phép các nhà phát triển chọn một công cụ phù hợp với nhu cầu cụ thể của họ. Nhiều giải pháp hỗ trợ các loại cấu trúc liên kết khác nhau, cho phép chúng thích ứng với các yêu cầu cụ thể của trò chơi. Một số giải pháp mạng cũ, chẳng hạn như Photon PUN, Photon BOLT và UNET, đã lỗi thời và không được khuyến nghị sử dụng trong các dự án mới, trong khi Netcode cho Thực thể và Netcode cho GameObjects vẫn đang trong giai đoạn thử nghiệm hoặc tiền phát hành. vẫn chưa cho phép chúng được sử dụng vào sản xuất.