Khi nào nên sử dụng Command và RpcClient


7

Tôi đang làm việc trong một dự án theo lượt nhiều người chơi trong sự thống nhất 5.4 và Mạng Unity. Tôi đang cố gắng học Mạng và một điều tôi tự hỏi là khi nào nên sử dụng [Command][RpcClient].

Tôi biết sự khác biệt giữa cả hai:

  • Command được thực hiện bởi máy chủ và máy khách được đồng bộ hóa với nó (IE: người chơi X đã bắn một viên đạn, gửi lệnh đến máy chủ, tính toán quỹ đạo và đồng bộ hóa với máy khách).
  • RpcClient lệnh được gửi đến máy khách (IE Player đã chết?)

Khi tôi viết một hàm, tôi cần phải tự hỏi mình câu hỏi nào để biết đó là Lệnh hay Cuộc gọi Thủ tục từ xa.


Theo cách bạn nói, hãy sử dụng Commandkhi đó là hành động máy khách yêu cầu phản hồi từ máy chủ, như gửi GET\POSTyêu cầu http và mong đợi kết quả, và sử dụng RpcClientkhi đó 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ư PUTyêu cầu http.
Giora Guttsait

1
Câu hỏi: Tôi có cần cập nhật máy chủ về những gì khách hàng đã làm không? Chỉ huy. Tôi có cần cập nhật máy khách vì điều gì đó đã xảy ra trên máy chủ không? RPC
jgallant

Tôi không nghĩ rằng có thể có một số câu hỏi phổ quát, khi bạn thực hành một chút, bạn sẽ dễ dàng tìm ra phương pháp nào: cho người khác biết hoặc lắng nghe những gì người khác đã làm
Yevhen

Câu trả lời:


5

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][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]NetworkTransformscũ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, NetworkTransformv.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 ShotObjectlệ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 FireGunlệ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.


Đối với người dùng trong tương lai: Đơn giản khác nhau là [Lệnh] [1]: Máy khách đến máy chủ [RPC] [2]: Máy chủ đến máy khách [1]: docs.unity3d.com/ScriptReference/ trộm [2]: docs.unity3d.com/ Hướng dẫn / UNetActions.html
Muhammad Faizan Khan
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.