Lý lịch
Trong trò chơi client-server bình thường, máy chủ là có thẩm quyền có nghĩa nó có tiếng nói cuối cùng như thế nào tình trạng trò chơi tồn tại và chịu trách nhiệm đảm bảo khách hàng biết tình trạng trò chơi hiện tại. Nó thực hiện điều này bằng cách lấy tất cả logic của trò chơi và chạy nó thay vì máy khách * và sau đó gửi các bản cập nhật khi thấy phù hợp. Các khối xây dựng cơ bản hầu hết các cơ là [Command]
, [ClientRpc]
và [TargetRpc]
các thuộc tính. Đây không phải là mức siêu cao như các công cụ đồng bộ hóa tự động như [SyncVar]
và NetworkTransforms
cũng không phải là mức siêu thấp như ổ cắm.
* Nó thực hiện điều này trong phạm vi có thể để không giới thiệu quá nhiều băng thông mạng (gây ra hiệu suất kém) và độ phức tạp. Vì vậy, khách hàng thường chịu trách nhiệm mô phỏng và dự đoán vật lý, ánh sáng và các tác vụ chuyên sâu khác trong khi máy chủ chỉ đồng bộ hóa trạng thái đối tượng, vị trí và cung cấp thông báo trò chơi để phát âm thanh phía máy khách và thay đổi giao diện người dùng.
Chúng khác nhau như thế nào
[ Lệnh ] - [Command]
Thuộc tính được gọi bởi máy khách (!) Và được thực hiện bởi máy chủ trên cùng một đối tượng. Khách hàng chỉ có thể gọi điều này trên các đối tượng mà nó có thẩm quyền. Chúng thường chuyển tiếp một số mục đích của khách hàng như bắn súng của tôi hoặc gửi tin nhắn trò chuyện. Bỏ qua tất cả đồng bộ hóa tự động ( SyncVars
, NetworkTransform
v.v.), đây là cách duy nhất để khách hàng thực hiện điều gì đó trên máy chủ và vì vậy tất cả các hành động mạng của khách hàng có cơ hội thay đổi trò chơi hoặc ảnh hưởng đến các khách hàng khác cần phải là [Command]
khách hàng có thể gọi để chạy trên máy chủ.
[ ClientRpc ] - [ClientRpc]
Thuộc tính được gọi trên máy chủ và được thực thi trên tất cả các máy khách hiện đang được kết nối với máy chủ cho một đối tượng nhất định. [ClientRpc]
thường được sử dụng nhất để thông báo cho khách hàng về những thay đổi trong trò chơi như thay đổi điểm số hoặc họ đã chết (để phát hình ảnh động và âm thanh chết trên tất cả màn hình của người chơi).
[ TargetRpc ] - Đã thêm vào Unity 5.4 - [TargetRpc]
Thuộc tính giống như trên nhưng chỉ được thực thi trên một máy khách cụ thể khi được gọi trên máy chủ. Máy chủ chuyển một NetworkConnection
đối tượng để biểu thị máy khách nào nó muốn thực thi TargetRpc
.
Một tổng quan siêu hữu ích về tất cả những điều này (bao gồm một sơ đồ tiện lợi) có thể được tìm thấy trong loạt bài hướng dẫn của UNET .
Khi máy chủ có vấn đề
Những gì tôi mô tả ở trên là cách sử dụng phổ biến nhất cho các loại lệnh này trong đó quyền hạn của máy chủ là rất quan trọng (như các trò chơi cạnh tranh). Nhiều trò chơi thông thường hơn trong đó gian lận không phải là một vấn đề lớn (trò chơi coop, trò chơi mà bạn tin tưởng người chơi khác không gian lận) có thể được cấu trúc khác nhau.
Một ví dụ có thể là một trò chơi trong đó bạn bắn súng để bắn kẻ thù. Trong một trò chơi không cạnh tranh trong đó gian lận không phải là vấn đề, tôi có thể có một ShotObject
lệnh mà khách hàng gọi với các đối tượng họ bắn. Điều này thực sự dễ gian lận nhưng độ phức tạp thấp. Tuy nhiên, trong một trò chơi nhiều người chơi cạnh tranh, tôi sẽ cần một FireGun
lệnh không có đối số và mô phỏng Raycast cho tiếng súng trên máy chủ để khách hàng không thể gian lận. Điều này giới thiệu sự phức tạp bổ sung của việc sao lưu mô phỏng máy chủ đến khi máy khách quay, thực hiện phát sóng, và sau đó tiếp tục trò chơi.
Nguyên tắc cơ bản ở đây là khi quyền của máy chủ có vấn đề, hãy chạy càng nhiều càng tốt trên máy chủ. Khi bạn không được tự do làm những gì bạn muốn.
Command
khi đó là hành động máy khách yêu cầu phản hồi từ máy chủ, như gửiGET\POST
yêu cầu http và mong đợi kết quả, và sử dụngRpcClient
khi đó là sự kiện xảy ra do vòng lặp cập nhật hoặc bất cứ điều gì trên máy chủ, và khách hàng cần được sửa đổi, tương tự nhưPUT
yêu cầu http.