Client gửi input hoặc yêu cầu, không gửi kết quả cuối cùng.
Unity Dedicated Server chạy gameplay và giữ State Authority.
Client giữ Input Authority trên avatar để gửi input và prediction.
[Networked] lưu state, RPC gửi sự kiện/yêu cầu, Input truyền thao tác theo tick.
Photon Cloud lo session, matchmaking và kết nối; Photon không chạy Unity server build thay bạn.
Dedicated Server công bằng hơn, nhưng bạn phải trả chi phí hosting và vận hành.
Câu quan trọng nhất: Client gửi ý định. Server quyết định kết quả.
1. Dedicated Server giải quyết vấn đề gì?
Trong game offline chỉ có một bản game state. Trong game online, mỗi máy có thể nhìn thấy thế giới ở một thời điểm khác nhau.
Ví dụ:
Client A thấy mình đã đi qua cửa.
Client B vẫn thấy A đứng trước cửa.
Một gói tin đang đến muộn.
Một client bị chỉnh sửa đang cố gửi tốc độ bất thường.
Câu hỏi gốc của multiplayer là:
Máy nào có quyền quyết định state nào là đúng?
Dedicated Server chọn một câu trả lời rõ ràng: server là trọng tài duy nhất.
Ví dụ di chuyển
Client không nên gửi:
Vị trí của tôi bây giờ là (9999, 0, 9999).
Client nên gửi:
Tôi đang nhấn sang phải và giữ nút chạy.
Server lấy input đó, áp dụng tốc độ hợp lệ, kiểm tra va chạm rồi tạo vị trí chính thức.
Hãy hình dung:
Client là cầu thủ.
Input là hành động cầu thủ muốn thực hiện.
Server là trọng tài.
Snapshot là kết quả chính thức gửi lại cho mọi người.
2. Photon, Unity Server và Hosting là ba thứ khác nhau
Một hệ thống Dedicated Server thường có ba lớp:
Thành phần
Trách nhiệm
Photon Cloud
Session, lobby, matchmaking, kết nối và relay
Unity Headless Server
Physics, AI, damage, inventory và luật thắng thua
Hosting/Orchestrator
Mở process, cấp port, scale máy và shutdown
Unity Headless Server
Đây vẫn là game Unity của bạn:
Có scene, GameObject và component.
Chạy gameplay code và physics nếu cần.
Không cần UI, camera, âm thanh hay render như client.
Có NetworkRunner khởi động bằng GameMode.Server.
Server không đại diện cho một người chơi cục bộ. Nó tồn tại để mô phỏng và giữ state chính thức.
Photon Cloud
Photon giúp server và client tìm thấy nhau trong cùng một session. Photon không tự chạy:
AI của quái.
Logic súng.
Inventory.
Match controller.
Bản Unity headless của game.
Hosting
Unity server build cần chạy trên:
VPS hoặc máy riêng.
Docker/Kubernetes.
GameLift, PlayFab, Edgegap, Hathora, Gameye hoặc dịch vụ tương tự.
Vì thế có hai loại chi phí:
Dịch vụ Photon/CCU.
CPU, RAM, băng thông và vận hành server.
3. Dedicated, Host hay Shared?
### Dedicated Server
Điểm mạnh:
Không phụ thuộc vào máy một người chơi.
Server kiểm tra toàn bộ gameplay.
Phù hợp với game cạnh tranh.
Đổi lại:
Tốn chi phí máy chủ.
Cần deployment, monitoring và orchestration.
Host Mode
Host Mode dùng cùng tư duy Client-Server:
Host có State Authority.
Host đồng thời là một player.
Các client khác kết nối tới host.
Đây là lựa chọn tốt để phát triển gameplay trước. Khi logic authoritative đã ổn, bạn có thể chuyển peer chạy server sang GameMode.Server.
Điểm yếu là host có lợi thế và trận đấu phụ thuộc vào máy của họ.
Shared Mode
Shared Mode phân tán authority và giúp prototype nhanh. Nó phù hợp khi gian lận không tạo hậu quả nghiêm trọng.
Với shooter cạnh tranh, để client tự quyết định “tôi đã bắn trúng ai” thường không phải lựa chọn tốt.
Nếu project có PhotonView, PhotonNetwork hoặc MonoBehaviourPunCallbacks, bạn đang dùng PUN, không phải Fusion. API và authority model của hai SDK khác nhau.
4. Bảy key concept quan trọng
4.1 NetworkRunner
NetworkRunner là trung tâm của một peer Fusion. Nó quản lý:
Trong Host/Server Mode, client không tự spawn network object authoritative. Client gửi yêu cầu; server quyết định.
5. Các key cấu hình thường gặp
Key
Dùng để làm gì?
Ví dụ
AppId Fusion
Xác định ứng dụng Photon
Lấy từ Photon Dashboard
GameMode
Chọn vai trò runner
Server, Client, Host
SessionName
Tên một trận đấu
ranked-1042
PlayerCount
Số người tối đa
16
Region
Khu vực kết nối
asia, us, eu
Address
Local IP/UDP port server bind
0.0.0.0:27015
CustomPublicAddress
Public endpoint do host cấp
Public IP và port
SessionProperties
Metadata matchmaking
map, mode, rank
SceneManager
Đồng bộ scene network
NetworkSceneManagerDefault
AuthenticationValues
User ID/token xác thực
Token từ backend
Ba lưu ý
AppIdkhông phải password. Nó không chứng minh người chơi là ai. Game thật cần authentication riêng.
Session properties không phải gameplay state. Chúng phù hợp để lọc map/mode, không thay thế [Networked].
Port public có thể khác port trong container. Khi hosting map port, CustomPublicAddress giúp công bố đúng endpoint.
6. Bốn ví dụ gameplay
Tình huống
Client gửi
Server kiểm tra
State cuối
Di chuyển
Hướng và nút chạy
Tốc độ, collision, trạng thái stun
Position/velocity
Nhặt item
RequestPickup(ItemId)
Khoảng cách, inventory, item còn tồn tại
Item despawn, inventory đổi
Mở cửa
Yêu cầu tương tác
Khoảng cách, chìa khóa, trạng thái cửa
IsOpen = true
Bắn hitscan
Fire input và hướng ngắm
Cooldown, đạn, lag-compensated hit
Health mục tiêu giảm
Tại sao server phải kiểm tra?
Hai player có thể cùng nhặt một item. Server xử lý theo tick/order và chỉ trao item cho một người.
Một client có thể gửi input di chuyển quá lớn. Server chuẩn hóa vector và dùng tốc độ do server cấu hình.
Một người bắn thấy mục tiêu ở vị trí cũ do latency. Fusion Lag Compensation cho server kiểm tra hitbox trong lịch sử từ góc nhìn của người bắn mà vẫn giữ authority ở server.
7. Luồng hoàn chỉnh của một session
1. Unity server process được khởi động
2. NetworkRunner chạy GameMode.Server
3. Server tạo Photon session
4. Client chạy GameMode.Client
5. Client tìm và join session
6. Server spawn avatar, gán Input Authority
7. Input → simulation → snapshot lặp theo tick
8. Match kết thúc, lưu kết quả và shutdown
Scene thường được chia đơn giản:
0.Launch
1.Menu
2.Gameplay
Launch quyết định đây là server hay client.
Server đi vào session startup.
Client đi tới menu và matchmaking.
Server/Host là scene authority trong Client-Server topology.