Xây dựng trò chơi nhiều người chơi với Amazon GameSparks và Amazon GameLift

Trò chơi nhiều người chơi dựa trên phiên (session)  là một dạng trò chơi trực tuyến phổ biến, vì chúng cung cấp cho người chơi trải nghiệm nhanh chóng, hấp dẫn mà họ có thể tham gia bất cứ lúc nào. Tuy nhiên, việc xây dựng một trò chơi nhiều người chơi trực tuyến dựa trên phiên có thể mở rộng và đáng tin cậy không phải là điều dễ dàng, vì có nhiều thành phần cần được phát triển. Bạn cần lưu trữ máy chủ trò chơi để có trải nghiệm chơi trò chơi ổn định và nhất quán. Bạn cần một chương trình phụ trợ (backend) trò chơi cung cấp khả năng quản lý danh tính (xác thực) người chơi và lưu trữ dữ liệu người chơi cũng như một cách để giao tiếp với phần phụ trợ trò chơi từ trò chơi của bạn. Bạn cần một dịch vụ matchmaking để nhóm những người chơi lại với nhau. Và cuối cùng, bạn cần thực hiện tất cả những điều này trên quy mô lớn một cách tiết kiệm chi phí. Đối với nhiều studio trò chơi, điều này có thể là một thách thức vì nó ngụ ý các công nghệ và tài nguyên nằm ngoài mục tiêu của họ là làm cho trải nghiệm thú vị.

Trong bài đăng này, bạn sẽ học cách kết hợp Amazon GameSparks (hiện đang trong bản xem trước), Máy chủ thời gian thực Amazon GameLift và GameLift FlexMatch để thực hiện tất cả những điều trên một cách đơn giản. Chúng tôi giới thiệu với bạn một giải pháp mẫu sử dụng Amazon GameSparks làm phần phụ trợ cho danh tính người chơi, với kết nối ứng dụng khách trò chơi với phần phụ trợ được cung cấp bởi SDK ứng dụng khách GameSparks. Amazon GameSparks đã được tung ra vào đầu năm nay ở dạng bản xem trước. Hiện tại, không có khoản phí nào khi sử dụng Amazon GameSparks trong khi xem trước, mặc dù bạn sẽ bị tính phí cho các dịch vụ AWS khác mà bạn sử dụng trong thời gian đó. Mẫu sử dụng Máy chủ thời gian thực Amazon GameLift để lưu trữ máy chủ trò chơi đơn giản và GameLift FlexMatch để matchmaking. Chúng tôi sẽ sử dụng một trò chơi mẫu mà bạn có thể quen thuộc nếu bạn đã chơi với GameLift trước đó: trò chơi Mega Frog Race Unity đã được giới thiệu lần đầu tiên trên blog AWS Game Tech này một thời gian trước. Chúng tôi đã sửa đổi trò chơi để hoạt động với GameSparks cho mẫu cụ thể này và chúng tôi cũng đã tích hợp GameLift FlexMatch.

Lưu ý rằng Amazon GameSparks hiện đang trong bản xem trước. Chúng tôi khuyên bạn không nên sử dụng nó cho khối lượng công việc sản xuất trong giai đoạn xem trước.

Bạn có thể tìm thấy mẫu đầy đủ cho máy chủ trò chơi, máy khách trò chơi và các chức năng phụ trợ, bao gồm mã nguồn và hướng dẫn triển khai, có thể tìm thấy trong kho lưu trữ AWS Sample GitHub.

Trước khi chúng tôi trình bày các bước triển khai, dưới đây là tổng quan về các thành phần của mẫu.

Tổng quan

Sơ đồ sau minh họa kiến trúc của giải pháp mẫu. Như bạn có thể thấy, một số dịch vụ AWS đã được sử dụng. Chúng tôi sẽ giải thích cách sử dụng từng thứ này trong các phần sau;

Chương trình phụ trợ trò chơi phi máy chủ – Amazon GameSparks

Một trong những điều quan trọng nhất mà chúng tôi cần là dịch vụ theo dõi người chơi và dữ liệu của họ, đồng thời cho phép họ bắt đầu các yêu cầu matchmaking. Đây là trách nhiệm của một trò chơi phụ trợ. Trong mẫu này, chúng tôi sử dụng Amazon GameSparks cho mục đích này. Amazon GameSparks là một dịch vụ AWS được quản lý hoàn toàn cung cấp chương trình phụ trợ cho các nhà phát triển trò chơi, cho phép họ tập trung vào việc xây dựng trò chơi của họ và để lại việc quản lý và mở rộng cơ sở hạ tầng cloud cho GameSparks. Amazon GameSparks cũng hỗ trợ tạo mã SDK ứng dụng trò chơi được điều chỉnh cho phù hợp với phần phụ trợ trò chơi độc đáo của bạn, giúp bạn dễ dàng gọi chức năng trong GameSparks từ mã riêng của trò chơi, cho phép bạn tập trung vào việc phát triển trò chơi của mình thay vì chỉ định và triển khai các giao thức giao tiếp mạng hai chiều giữa phần phụ trợ (backend) của bạn và ứng dụng trò chơi. Hiện tại, Unity với C # được hỗ trợ.

Amazon GameSparks hoạt động thông qua tin nhắn và trình xử lý. Bạn xác định thông báo trong Bảng điều khiển quản lý AWS bằng cách chỉ định hình dạng của chúng và vai trò của chúng trong phần phụ trợ của bạn. Một số loại tin nhắn được hỗ trợ; thông báo cho phép chương trình phụ trợ GameSparks thông báo cho khách hàng trò chơi về những điều đã xảy ra trong chương trình phụ trợ. Các sự kiện cho phép máy khách trò chơi thông báo cho phần phụ trợ của GameSparks về những điều đã xảy ra trong trò chơi. Cuối cùng, các yêu cầu là một dạng của loại tin nhắn cho phép một ứng dụng khách trò chơi gửi một tin nhắn đến phần phụ trợ mà mong đợi phản hồi từ phần phụ trợ. Trong giải pháp mẫu của chúng tôi, chúng tôi chỉ sử dụng các thông báo thuộc loại yêu cầu.

Sau khi đã chỉ định tin nhắn của mình, bạn có thể viết trình xử lý cho chúng bằng chức năng Cloud Code của GameSparks. Người xử lý có thể thực hiện logic tùy chỉnh cho các thông báo nhận được từ ứng dụng khách trò chơi, chẳng hạn như để lưu trữ và truy xuất dữ liệu dành riêng cho người chơi. Bạn triển khai Cloud Code của mình bằng JavaScript (ES5.1) và sau khi được triển khai, GameSparks sẽ đảm nhận việc chạy và thực thi.

Amazon GameSparks ’Cloud Code hỗ trợ kích hoạt các chức năng AWS Lambda, là một dịch vụ tính toán cho phép bạn chạy mã mà không cần cấp phép hoặc quản lý máy chủ. Lambda tích hợp với các dịch vụ AWS khác, cho phép bạn khai thác chức năng của các dịch vụ khác này khi bạn cần cho trò chơi của mình.

Phần phụ trợ của GameSparks cho Mega Frog Race chủ yếu đảm nhận hai việc: bắt đầu yêu cầu matchmaking và gửi lại kết quả cho người chơi thông qua một cuộc thăm dò về trạng thái matchmaking. Trong giải pháp phụ trợ của chúng tôi, chúng tôi sẽ sử dụng một hàm Lambda để bắt đầu yêu cầu matchmaking và gọi Lambda này để phản hồi yêu cầu StartMatchmaking thông qua trình xử lý yêu cầu Cloud Code

Lưu trữ máy chủ trò chơi – Amazon GameLift Realtime Servers

Một phần quan trọng khác của trò chơi nhiều người chơi là máy chủ trò chơi lưu trữ. Bằng cách tận dụng dịch vụ lưu trữ máy chủ trò chơi chuyên dụng cho trò chơi có quyền máy chủ của chúng tôi, chúng tôi có thể đảm bảo rằng người chơi của chúng tôi có thể tận hưởng trải nghiệm chơi trò chơi nhanh chóng, đáng tin cậy, an toàn và nhất quán.

Đối với dịch vụ lưu trữ máy chủ trò chơi, chúng tôi đã chọn Amazon GameLift Realtime Servers làm nền tảng lưu trữ máy chủ trò chơi của mình. Máy chủ thời gian thực là máy chủ trò chơi sẵn sàng di chuyển nhẹ, có thể tùy chỉnh mà GameLift cung cấp để sử dụng với các trò chơi nhiều người chơi không cần máy chủ trò chơi tùy chỉnh cho các phép tính và vật lý phức tạp. Máy chủ thời gian thực của GameLift hỗ trợ  Client SDK cho phép tích hợp dễ dàng giữa trò chơi và máy chủ trò chơi.

Đối với các trò chơi dựa trên phiên khác có yêu cầu máy chủ trò chơi phức tạp hơn, bạn có thể sử dụng GameLift do Amazon quản lý cùng với máy chủ trò chơi chuyên dụng và công nghệ mạng của riêng bạn thay vì Máy chủ GameLift thời gian thực.

Matchmaking – Amazon GameLift FlexMatch

Một phần quan trọng khác của các trò chơi nhiều người chơi dựa trên phiên như Mega Frog Race là matchmaking. Matchmaking là hành động kết hợp những người chơi với nhau thành một trận đấu, thường có những ràng buộc nhất định để đảm bảo những người chơi có trình độ kỹ năng ngang nhau được khớp với nhau.

Máy chủ trò chơi của GameLift có thể được sử dụng với bất kỳ triển khai matchmaking (tùy chỉnh) nào, nhưng đối với Mega Frog Race, chúng tôi đã chọn GameLift FlexMatch làm giải pháp matchmaking của mình. Với FlexMatch, bạn có thể xây dựng một bộ quy tắc tùy chỉnh để xác định một trận đấu nhiều người chơi trông như thế nào cho trò chơi của bạn và xác định cách đánh giá và chọn người chơi tương thích cho mỗi trận đấu.

Vì Mega Frog Race không có cơ sở người chơi đông đảo nên chúng tôi đã sử dụng một cấu hình ghép rất đơn giản không có giới hạn, kết hợp bất kỳ ai với bất kỳ ai khác, bất kể trình độ kỹ năng và vị trí thực tế của người chơi. Tuy nhiên, một khi trò chơi thu hút nhiều người chơi hơn, chúng tôi có thể muốn sửa đổi cách matchmaking của mình để cung cấp cho người chơi trải nghiệm chơi cân bằng và vui vẻ hơn. Với FlexMatch tại chỗ, việc này sẽ trở nên khá đơn giản!

Để cung cấp trạng thái matchmaking cho khách hàng trò chơi, chúng tôi đã triển khai một phương pháp hay nhất để cho phép trò chơi của chúng tôi mở rộng quy mô: chúng tôi sử dụng thông báo sự kiện FlexMatch để nhận các sự kiện matchmaking trong Amazon Simple Notification Service (SNS). Đến lượt nó, một hàm Lambda sẽ xử lý các sự kiện matchmaking đó và lưu trữ kết quả trong DynamoDB nơi mà sau đó ứng dụng khách trò chơi có thể truy xuất chúng thông qua trình xử lý yêu cầu GameSparks Cloud Code đọc trực tiếp trạng thái matchmaking từ DynamoDB.

Game client – Unity

Cuối cùng nhưng không kém phần quan trọng, chúng tôi có một Game client của mình! Mega Frog Race là một trò chơi đơn giản được viết bằng Unity, trong đó hai người chơi thi đấu như những con ếch để cố gắng lao về đích nhanh nhất có thể, đồng thời cố gắng căn thời gian cho các bước nhảy của mình một cách chính xác để tránh làm chúng mệt mỏi. Trò chơi sử dụng Amazon GameSparks SDK để kết nối giữa trò chơi và phần phụ trợ trò chơi và  GameLift Realtime Client SDK để giao tiếp trong thời gian thực với máy chủ trò chơi chuyên dụng của chúng tôi do GameLift Realtime cung cấp.

Triển khai

Bây giờ chúng ta đã thảo luận về các phần khác nhau của kiến trúc, hãy cùng xem xét mẫu và triển khai nó!

Mẫu sử dụng AWS Cloud Development Kit (CDK) v2 để triển khai cơ sở hạ tầng của chúng tôi. Với CDK, bạn xác định cơ sở hạ tầng AWS của mình bằng mã, sau đó triển khai nó bằng một lần nhấn nút. Điều này cho phép bạn triển khai các phương pháp hay nhất về kỹ thuật phần mềm như đánh giá mã cho cơ sở hạ tầng của bạn.

Mẫu bao gồm hai CDK stack, triển khai máy chủ trò chơi, thiết lập cơ sở hạ tầng mai mối và định cấu hình vai trò IAM cần thiết cho Amazon GameSparks để cấp cho nó quyền truy cập vào cơ sở hạ tầng mai mối. Sau khi các CDK stack đã được triển khai, bạn cần định cấu hình phần phụ trợ GameSparks thông qua Bảng điều khiển quản lý AWS, tạo mã ứng dụng khách GameSparks và cuối cùng tải SDK ứng dụng khách GameSparks vào dự án trò chơi mẫu và định cấu hình nó.

Trước khi bạn triển khai mẫu, hãy đảm bảo bạn đã cài đặt các yêu cầu sau:

Ngoài ra, hãy đảm bảo bạn tải xuống các phần phụ thuộc sau cần thiết để xây dựng ứng dụng khách trò chơi của chúng tôi:

Khi bạn đã có tất cả những điều trên, chúng tôi sẽ bắt đầu bằng cách sao chép kho lưu trữ git thông qua phiên làm việc đầu cuối hoặc Git GUI yêu thích của chúng tôi, sau đó thay đổi thư mục thành kho lưu trữ được sao chép:

git clone https://github.com/aws-samples/amazon-gamesparks-integration-with-gamelift.git
cd amazon-gamesparks-integration-with-gamelift

Triển khai cơ sở hạ tầng phụ trợ và lưu trữ máy chủ trò chơi

Tiếp theo, bạn sẽ triển khai dịch vụ lưu trữ máy chủ trò chơi và các phần của cơ sở hạ tầng phụ trợ bên ngoài GameSparks liên quan đến việc xử lý mai mối.

Từ thư mục gốc của kho lưu trữ git của mẫu mà bạn đã kiểm tra trước đó, hãy chạy các lệnh sau để cài đặt phần phụ thuộc CDK và tạo mã:

yarn install --frozen-lockfile

yarn bootstrap

yarn build

Tiếp theo, chúng tôi sẽ cần tải tệp .zip của máy chủ trò chơi lên S3 theo cách thủ công và thiết lập tệp cấu hình cục bộ để trỏ đến vị trí của tệp này:

  • Tạo một nhóm S3 trong khu vực us-East-1 với tên không chứa bất kỳ dấu chấm nào (‘.’); thùng không thể được mã hóa và không được công khai.
  • Tải “package / game-server / game-server.zip” lên từ kho lưu trữ git mẫu vào nhóm S3. Tệp .zip này đã được tạo trước đó bằng lệnh yarn build. Bạn có thể tải tệp này lên thư mục gốc của nhóm S3 khi thử nghiệm, nhưng đối với khối lượng công việc sản xuất, hãy xem xét sử dụng sơ đồ đặt tên cho các khóa đối tượng S3 có số phiên bản.
  • Trong kho lưu trữ git mẫu, hãy sao chép “package / Infra / config / Infra-config.example.json” sang “package / Infra / config / Infra-config.json” và sau đó mở tệp “Infra-config.json” đã sao chép trong một trình soạn thảo văn bản.
  • Sửa đổi các khóa assetBucketName và assetObjectKey trong đối tượng JSON, sao cho assetBucketName chứa tên nhóm của nhóm S3 mà bạn đã tạo ở bước đầu tiên và assetObjectKey chứa khóa đối tượng S3 của tệp bạn đã tải lên. Nếu bạn không chắc chắn nên sử dụng gì ở đây, hãy lưu ý rằng bạn có thể kiểm tra khóa khi xem tổng quan đối tượng trong bảng điều khiển Amazon S3.

Bây giờ chúng tôi đã tải lên tệp .zip của máy chủ trò chơi, chúng tôi đã sẵn sàng triển khai ngăn xếp CDK! Từ thư mục gốc của kho lưu trữ git của mẫu, hãy chạy các lệnh sau:

cd packages/infra

yarn cdk synth

yarn cdk bootstrap

yarn cdk deploy "*/MatchmakingStack"

yarn cdk deploy "*/MatchmakingMgmtStack"

Quá trình triển khai CDK có thể mất vài phút để hoàn thành vì tất cả cơ sở hạ tầng đã được cung cấp và các máy chủ trò chơi của bạn được triển khai. Sau khi một trong hai kết thúc, bạn sẽ thấy một cái gì đó như sau:

Bây giờ bạn có máy chủ trò chơi lưu trữ, cũng như cơ sở hạ tầng phụ trợ trò chơi tiên quyết được triển khai.

Để xác minh rằng máy chủ trò chơi GameLift Realtime đang chạy chính xác, hãy làm theo các bước sau:

  • Mở AWS Management Console và đảm bảo rằng bạn chọn khu vực North Virginia (us-east-1).
  • Điều hướng đến bảng điều khiển Amazon GameLift.
  • Cuộn xuống cho đến khi bạn thấy tổng quan về Builds, Fleets và Aliases và xác minh rằng:
    • One (1) Fleet đang hoạt động, có tên là SampleRealtimeFleet
    • One (1) Alias, có tên SampleGameServerFleetAlias
  • Nhấp vào văn bản SampleRealtimeFleet màu xanh lam để kiểm tra đội xe.
  • Xác minh rằng bạn thấy:
    • One (1) active instance
    • One (1) active server
  • Chuyển sang tab Events và kiểm tra xem không có lỗi nào gần đây (ví dụ: “SERVER_PROCESS_TERMINATED_UNHEALTHY”).

Nếu mọi thứ được triển khai thành công, bạn đã sẵn sàng thiết lập chương trình phụ trợ của GameSparks!

Thiết lập chương trình phụ trợ trò chơi Amazon GameSparks

Để thiết lập phần phụ trợ trò chơi Amazon GameSparks, hãy mở AWS Management Console, đảm bảo bạn chọn khu vực North Virginia (us-east-1), sau đó điều hướng đến Amazon GameSparks và chọn Next.

Sau đó, sử dụng “MegaFrogRace” cho tên trò chơi và sử dụng vai trò “GameDeployment-MegaFrogRace” hiện có cho giai đoạn Dev, sau đó chọn Create. Vai trò này đã được tạo trước đây bởi triển khai CDK và đã được định cấu hình trước để cho phép GameSparks kết nối với các tài nguyên đã triển khai của chúng tôi.

Có hai cách để thiết lập phần phụ trợ trò chơi GameSparks cho giải pháp mẫu MegaFrogRace: theo cách thủ công thông qua bảng điều khiển quản lý hoặc bằng cách nhập tệp JSON ảnh chụp nhanh được cung cấp trong kho lưu trữ git của mẫu. Nếu bạn muốn nhanh chóng chạy chương trình phụ trợ, hãy nhập ảnh chụp nhanh JSON, mặc dù nếu bạn quan tâm đến việc thực hiện bất kỳ sửa đổi nào sau này, chúng tôi khuyến khích bạn thiết lập chương trình phụ trợ theo cách thủ công vì điều này sẽ giúp bạn hiểu cách thiết lập GameSparks cho trò chơi của riêng bạn sau.

Thiết lập chương trình phụ trợ trò chơi bằng cách nhập ảnh chụp nhanh JSON

Để thiết lập phần phụ trợ trò chơi GameSparks bằng cách nhập tệp snapshot JSON, hãy điều hướng đến giai đoạn “Dev” của trò chơi. Sau đó, trong Snapshot, chọn Actions và cuối cùng là Import.

Bạn sẽ thấy hộp thoại sau:

Chọn Choose file, sau đó mở tệp “megafrograce_gamesparks_int.json” mà bạn có thể tìm thấy trong kho lưu trữ Git của mẫu trong “package / matchmaking-mgmt / asset / megafrograce_gamesparks_int.json“. Cuối cùng, chọn Import để bắt đầu quá trình nhập.

Quá trình nhập có thể mất một phút để hoàn tất. Bạn có thể xác minh rằng nó đã được nhập bằng cách điều hướng đến trang mã Cloud code của giai đoạn phát triển thông qua thanh bên điều hướng ở bên trái. Trên trang Cloud code, trong Requests → Custom, bạn sẽ thấy hai thông báo: StartMatchmakingGetMatchmakingInfo.

Đó là nó! Hiện chúng tôi đã định cấu hình phần phụ trợ trò chơi GameSparks cho Mega Frog Race và sẵn sàng triển khai cũng như thử nghiệm. Bây giờ bạn có thể bỏ qua phần “Deploying and testing our GameSparks game backend” bên dưới để tiếp tục.

Thiết lập phần phụ trợ trò chơi theo cách thủ công

Nếu bạn đã thiết lập phần phụ trợ trò chơi GameSparks thông qua snapshot JSON, bạn có thể bỏ qua phần này và chuyển thẳng đến phần thử nghiệm và triển khai. Nếu không, hãy đọc để biết thông tin về cách thiết lập phần phụ trợ trò chơi GameSparks theo cách thủ công!

Điều hướng đến GameSparks console trên AWS Management Console. Trong thanh bên ở bên trái, hãy đảm bảo MegaFrogRace được mở rộng, sau đó nhấp vào Dev để điều hướng đến giai đoạn phát triển của trò chơi của chúng tôi. Một phần Cấu hình mới sẽ xuất hiện; nhấp vào Cloud code bên dưới để điều hướng đến phần cloud code.

Bạn sẽ thấy trang sau:

Như đã đề cập trước đó, GameSparks hoạt động bằng cách sử dụng các tin nhắn và trình xử lý. Để dễ dàng phát triển cả Cloud Code và tích hợp ứng dụng khách trò chơi, bạn có thể xác định hình dạng của thông báo trong GameSparks và tạo mã ứng dụng trò chơi bao gồm các lớp C # và các loại ánh xạ tới các thông báo này. Chương trình phụ trợ của GameSparks sẽ lần lượt xác thực rằng các tin nhắn được gửi bởi ứng dụng khách trò chơi và Cloud Code phù hợp với hình dạng được chỉ định của chúng tôi, điều này làm tăng độ tin cậy của chương trình phụ trợ của chúng tôi. Mặc dù việc xác định hình dạng tùy chỉnh là không hoàn toàn cần thiết (chúng ta có thể sử dụng loại được gọi là “Any” để bỏ qua điều này), nhưng đó là một phương pháp hay nhất và làm cho việc tích hợp với trò chơi dễ dàng hơn rất nhiều. Nếu bạn đã quen với việc phát triển dịch vụ web, quá trình này tương tự như việc xác định một giản đồ trong OpenAPI và tạo giao diện máy khách và xác thực phía máy chủ từ đó.

Chúng tôi sẽ bắt đầu bằng cách tạo hình dạng MatchmakingStatus mã hóa trạng thái của phiếu yêu cầu mai mối của chúng tôi dưới dạng một loại liệt kê:

  • Chọn Configure, thao tác này sẽ mở ra menu thả xuống
  • Chọn Game-defined shapes, sẽ điều hướng bạn đến phần hình dạng do trò chơi xác định
  • Chọn Create shape
  • Trong phần định nghĩa hình dạng, hãy chọn “MatchmakingStatus” làm Name của hình dạng mới của chúng tôi
  • Đối với Type, hãy sử dụng “Enum”
  • Thêm các Values sau vào, chính xác như được hiển thị. Bạn có thể sử dụng nút “Add value” để thêm các giá trị bổ sung:
    • MatchmakingSearching
    • PotentialMatchCreated
    • MatchmakingSucceeded
    • MatchmakingFailed
    • MatchmakingTimedOut
    • MatchmakingCancelled
  • Chọn tên mô tả (tùy chọn), ví dụ: “Matchmaking ticket status”
  • Xác minh rằng cấu hình hình dạng của bạn phù hợp với những điều sau:
  • Chọn Create để hoàn tất quá trình tạo hình dạng

Tiếp theo, chúng tôi sẽ tạo hình dạng ConnectionInfo, hình dạng này sẽ chứa thông tin về cách ứng dụng khách trò chơi có thể kết nối với máy chủ trò chơi được lưu trữ của chúng tôi:

  • Như trước đó, hãy chọn Configure, sau đó chọn Game-defined shapes, sau đó chọn Create shape
  • Trong phần định nghĩa hình dạng, hãy chọn “ConnectionInfo” làm Name của hình dạng mới của chúng tôi
  • Đối với Loại, hãy sử dụng “Structure”
  • Thêm các Fields sau vào, chính xác như được hiển thị. Bạn có thể sử dụng nút “Add field” để thêm các trường bổ sung:
    • Port
      • Name: Port
      • Shape: Integer
      • Required: Yes
    • PlayerSessionID
      • Name: PlayerSessionID
      • Shape: String
      • Required: No
    • DNSName
      • Name: DNSName
      • Shape: String
      • Required: No
    • IPAddress
      • Name: IPAddress
      • Shape: String
      • Required: Yes

Chọn tên mô tả (tùy chọn), ví dụ: “Connection info for joining a server”

Xác minh rằng cấu hình hình dạng của bạn phù hợp với những điều sau:

  • Chọn Create để hoàn tất quá trình tạo hình dạng

Bây giờ chúng tôi đã xác định các hình dạng tùy chỉnh của mình, chúng tôi có thể xác định hai yêu cầu trong phần phụ trợ trò chơi của chúng tôi để cho phép ứng dụng khách trò chơi bắt đầu một yêu cầu mai mối và nhận thông tin của nó. Chúng tôi sẽ bắt đầu với yêu cầu StartMatchmaking, yêu cầu này sẽ gọi hàm Lambda mà chúng tôi đã triển khai trước đó qua CDK:

  • Điều hướng trở lại trang Cloud code cho giai đoạn Dev của MegaFrogRace
  • Chọn Create message
  • Đối với message type ở trên cùng, hãy chọn “Request”
  • Đối với Name, hãy sử dụng “StartMatchmaking”
  • Nhập mô tả tùy chọn, ví dụ: “Start a matchmaking request”
  • Chọn Create để tạo tin nhắn. Điều này sẽ điều hướng bạn đến trình chỉnh sửa yêu cầu.
  • Đảm bảo rằng hộp kiểm Enable client permission được chọn.
  • Vì chúng tôi không muốn thiết lập trường yêu cầu cho yêu cầu này, hãy đảm bảo rằng không có trường yêu cầu nào được thêm bằng cách chọn Remove trong Request fields nếu một trường đã được thiết lập tự động.
  • Yêu cầu này chỉ cần một trường phản hồi. Đã có một trường phản hồi được thiết lập một phần; nếu không, hãy chọn Add response field, sau đó thêm phần sau:
    • Field name: TicketId
    • Shape: String
    • Required: Yes
  • Trong Request handler, hãy dán mã sau:
// Get the current player ID
const currentPlayerId = GameSparks().CurrentPlayer().Id();

// Request a match via the Lambda function
const response = GameSparks().Lambda("RequestMatchmakingFunction").Invoke(
    {
        "currentPlayerId": currentPlayerId
    }
);
const ticketId = response.Payload.MatchmakingTicket.TicketId;

GameSparks().Logging().Debug("Ticket ID is: " + JSON.stringify(ticketId));

// Store the ticket ID for the matchmaking request in the player data
const data = {
  "TicketId": ticketId
}
GameSparks().CurrentPlayer().SetData(data);

// Return the ticket ID to the client
return GameSparks().Messaging().Response({"TicketId": ticketId});
  • Xác minh rằng bạn đã thiết lập trình xử lý và thông báo yêu cầu như sau:
  • Chọn Save để lưu yêu cầu

Tiếp theo, chúng tôi sẽ cần tạo yêu cầu GetMatchmakingInfo cho phép ứng dụng khách của trò chơi yêu cầu trạng thái mai mối hiện tại từ chương trình phụ trợ của trò chơi. Yêu cầu này trực tiếp lấy dữ liệu liên quan từ DynamoDB; cơ sở hạ tầng mà chúng tôi đã triển khai trước đó thông qua CDK sẽ đảm bảo rằng thông tin này có sẵn ở đó.

  • Điều hướng trở lại trang Cloud code cho giai đoạn Dev của MegaFrogRace nếu bạn chưa ở đó
  • Chọn Create message
  • Đối với message type ở trên cùng, hãy chọn “Request”
  • Đối với Name, hãy sử dụng “GetMatchmakingInfo”
  • Nhập mô tả tùy chọn, ví dụ: “Get matchmaking information, including status and optionally connection info, via DynamoDB”
  • Chọn Create để tạo tin nhắn. Điều này sẽ điều hướng bạn đến trình chỉnh sửa yêu cầu.
  • Đảm bảo rằng hộp kiểm Enable client permission được chọn.
  • Thiết lập trường sau trong Request fields:
    • Field name: TicketId
    • Shape: String
    • Required: No
  • Thiết lập các trường sau trong Response fields:
    • Status
  • Field name: Status
  • Shape: MatchmakingStatus
  • Required: Yes
  • ConnectionInfo
  • Field name: ConnectionInfo
  • Shape: ConnectionInfo
  • Required: No
  • Trong Request handler, hãy dán mã sau:
// Get the ticket ID from the request field if available, otherwise from the player data
let ticketId = message.TicketId;
if (ticketId === null || ticketId === undefined) {
  const data = GameSparks().CurrentPlayer().GetData(["TicketId"]);
  if (data.TicketId !== undefined) {
    ticketId = data.TicketId
  }
}

GameSparks().Logging().Debug("Ticket ID: " + ticketId);

// Get the Matchmaking ticket status and connection info from DynamoDB
const ddbResult = GameSparks().DynamoDB().GetItem("MatchmakingTicket", { "ticketId": ticketId });
const status = ddbResult.Item.matchmakingStatus;
GameSparks().Logging().Debug("Ticket data from DynamoDB: " + JSON.stringify(ddbResult));

// Create a local for the response object, to be returned later
const response = {
  "Status": status
};

if (status === "MatchmakingSucceeded") {
  // If the matchmaking succeeded, we have ConnectionInfo.
  // Create the ConnectionInfo response field and add it to the response
  const connectionInfo = {};
  if (ddbResult.Item.port !== undefined) {
    connectionInfo.Port = parseInt(ddbResult.Item.port);
  }
  if (ddbResult.Item.ip !== undefined) {
    connectionInfo.IPAddress = ddbResult.Item.ip;
  }
  if (ddbResult.Item.dnsName !== undefined) {
    connectionInfo.DNSName = ddbResult.Item.dnsName;
  }
  if (ddbResult.Item.playerSessionId !== undefined) {
    connectionInfo.PlayerSessionID = ddbResult.Item.playerSessionId;
  }
  response.ConnectionInfo = connectionInfo;
}

// Return the response
return GameSparks().Messaging().Response(response);
  • Xác minh rằng bạn đã thiết lập trình xử lý và thông báo yêu cầu như sau:
  • Chọn Save để lưu yêu cầu

Đó là nó! Bây giờ chúng tôi đã xác định hai thông báo này, đã đến lúc triển khai cloud code của chúng tôi cho giai đoạn Dev và thực hiện thử nghiệm đầu tiên của chúng tôi!

Triển khai và thử nghiệm chương trình phụ trợ trò chơi GameSparks của chúng tôi

Bây giờ chúng tôi đã định cấu hình phần phụ trợ trò chơi GameSparks của mình, chúng tôi có thể thực hiện triển khai đầu tiên và bắt đầu thử nghiệm!

Điều hướng trở lại trang cấu hình của Dev stage’s, sau đó chọn Deploy as new snapshot mới để triển khai cấu hình hiện tại.

Đặt tên mô tả (tùy chọn) cho mô tả snapshot, sau đó chọn Save để bắt đầu quá trình triển khai:

Đó là nó! Hiện chúng tôi đã hoàn tất việc thiết lập và triển khai chương trình phụ trợ GameSparks và sẵn sàng thực hiện thử nghiệm đầu tiên của mình. GameSparks có sẵn bộ khai thác thử nghiệm mà chúng tôi có thể sử dụng để xác thực việc triển khai của mình với người chơi mô phỏng mà không cần thực hiện tích hợp trò chơi.

  • Trên bảng điều khiển GameSparks, trong MegaFrogRace → Configuration, chọn Test harness để điều hướng đến giao diện khai thác kiểm tra. Một trình phát mới được tự động tạo và kết nối cho bạn.
  • Chọn yêu cầu StartMatchmaking từ ngăn Messages  (trong Requests → Custom)
  • Chọn Populate example để điền nội dung yêu cầu mẫu. Ngoài ra, bạn cũng có thể viết nội dung yêu cầu của riêng mình. Vì yêu cầu StartMatchmaking không có trường đầu vào, chúng ta có thể chỉ cần viết {}.
  • Cuối cùng, chọn Send message để thực hiện yêu cầu mai mối. Nếu mọi việc suôn sẻ, bạn sẽ nhận được phản hồi thành công có chứa TicketId, giống như sau:
  • Chọn yêu cầu GetMatchmakingInfo từ ngăn Messages (trong Requests → Custom)
  • Điền vào Request body theo cách thủ công hoặc bằng cách điền vào một ví dụ và chỉnh sửa nó. Yêu cầu này hỗ trợ cả phần thân trống ( {} ), điều này sẽ khiến trình xử lý yêu cầu tìm nạp ID vé từ dữ liệu người chơi như đã lưu trước đó hoặc bạn có thể chỉ định một ID vé cụ thể để lấy thông tin mai mối cho vé đó (ví dụ: {“TicketId”:”a27bdd4d-ebcc-46aa-87ed-147b210faed8″} , nhưng hãy đảm bảo thay thế giá trị bằng giá trị TicketId mà bạn đã nhận được từ yêu cầu StartMatchmaking trước đó)
  • Chọn Send message để gửi yêu cầu. Nếu mọi việc suôn sẻ, bạn sẽ nhận được phản hồi thành công, nhưng vì bạn là “người chơi” duy nhất hiện tại, bạn có thể sẽ nhận được thời gian chờ mai mối dưới dạng phản hồi trạng thái:
  • Nếu bạn muốn kiểm tra một yêu cầu matchmaking thành công đầy đủ với một trình phát thứ hai ảo khác, bạn có thể gọi hàm RequestMatchmakingFunction Lambda theo cách thủ công bằng cách kiểm tra nó trong Bảng điều khiển AWS Lambda. Sử dụng đầu vào hàm sau: {“currentPlayerId”: “my-test-player-id”} . Ngay sau khi bạn đã gọi hàm Lambda, hãy lặp lại các bước từ trên và bạn sẽ nhận được “MatchmakingSucceeded” dưới dạng Status khi gửi yêu cầu GetMatchmakingInfo, bao gồm thông tin kết nối để kết nối với máy chủ GameLift Realtime được lưu trữ!

Nếu bạn gặp bất kỳ lỗi nào trong quá trình thử nghiệm, hãy quay lại phần trước và xác minh rằng bạn đã thiết lập chính xác phần phụ trợ trò chơi của mình hoặc triển khai toàn bộ phần phụ trợ của GameSparks bằng cách nhập tệp snapshot JSON như đã đề cập trước đó trong bài đăng blog này.

Tích hợp game client với GameSparks

Bây giờ chúng tôi đã kiểm tra xem chương trình phụ trợ của chúng tôi có hoạt động hay không, chúng tôi sẽ thực hiện tích hợp cuối cùng trong ứng dụng trò chơi của mình. Chúng tôi sẽ cần hai thứ cho việc này: GameSparks Client SDK (tải xuống nếu bạn chưa có), cũng như Client Code cho dự án của chúng tôi, mà chúng tôi sẽ tạo ngay bây giờ:

  • Mở AWS Management Console và điều hướng đến bảng điều khiển Amazon GameSparks
  • Chọn đến giai đoạn Dev cho MegaFrogRace
  • Trong phần Snapshot, hãy chọn Actions, thao tác này sẽ mở ra menu thả xuống
  • Từ menu thả xuống, chọn Generate Code
  • Đối với Game client platform, hãy chọn “Unity”
  • Đối với Language, hãy chọn “C #”
  • Chọn Generate Code. Quá trình này có thể mất vài giây, vì vậy chúng ta cần đợi cho đến khi mã được tạo.
  • Sau khi mã có sẵn, hãy nhấp vào nút Download để tải xuống Client Code đã tạo cho chương trình phụ trợ của chúng tôi.

Bây giờ, chúng tôi sẽ cần cài đặt và định cấu hình SDK GameSparks,GameLift Realtime Client SDK và các phần phụ thuộc khác, đồng thời tải Client Code đã tạo của chúng tôi vào dự án.

  • Cài đặt GameLift Realtime Client SDK
    • Giải nén tệp GameLift Realtime Client SDK .zip mà bạn đã tải xuống trước đó
    • Tải lên giải pháp trong Visual Studio
    • Khôi phục gói NuGet và xây dựng nó từ Visual Studio, đảm bảo đúng mục tiêu .Net 4.5
    • Sao chép các tệp đã xây dựng sau vào dự án Unity, bạn có thể tìm thấy tệp này trong “packages/game-client/MegaFrogRace” trong kho lưu trữ Git của mẫu:
      • GameScaleRealTimeClientSDKNet45.dll
      • Google.Protobuf.dll
      • Log4net.dll
      • SuperSocket.ClientEngine.dll
      • WebSocket4Net.dl
  • Thiết lập DOTween
    • Giải nén gói DOTween bạn đã tải xuống trước đó và sao chép thư mục đã giải nén vào thư mục Assets trong dự án Unity.
    • Mở lại Unity và tải dự án MegaFrogRace
    • Vào Tools → Demigiant → DOTween Utility Panel và chọn Setup DOTween…
  • Cài đặt plugin Amazon GameSparks Client SDK:
    • Đi tới Window → Package Manager → + → Add package from tarball, sau đó chọn tệp AmazonGameSparks.tgz mà bạn đã tải xuống trước đó.
  • Tải GameSparks Client Code đã tạo vào dự án:
    • Giải nén tệp Amazon GameSparks Client Code .zip mà chúng tôi đã tạo và tải xuống trước đó.
    • Trong Unity, trong Project pane, duyệt đến thư mục GameSparks.
    • Nhấp chuột phải vào bên trong thư mục và chọn Import New Asset.
    • Chọn tệp MegaFrogRaceOperations.cs từ Client Code đã trích xuất.
  • Thiết lập kết nối GameSparks:
    • Trên AWS Management Console, điều hướng đến bảng điều khiển Amazon GameSparks, sau đó điều hướng đến giai đoạn MegaFrogRace’s Dev. Trong Dev stage configuration, bạn sẽ thấy một Key; sao chép cái này vào khay nhớ tạm của bạn để dùng sau.
    • Trong Unity, đi tới GameSparks menu → Setup Scene → Create connection. Assets/Amazon/GameSparks/Connection.asset sẽ xuất hiện trong thư mục dự án của bạn.
    • Chọn Connection object, sau đó trong Inspector panel, trong Game Key field, hãy dán key mà chúng tôi đã sao chép trước đó:
  • Mở title scene, nhấp vào Canvas, sau đó kéo Connection object từ Project window vào field “Connection Scriptable Object” trong Title Controller script. Amazon GameSparks Client SDK hiện đã được thiết lập và kết nối với phần phụ trợ GameSparks của bạn.

Bây giờ bạn đã tải client code và tất cả các phụ thuộc plugin! Lưu ý rằng dự án Unity đã được thiết lập trước đó để làm việc với client code này; nếu bạn đã thực hiện bất kỳ thay đổi nào đối với phần phụ trợ của GameSparks, bạn cũng sẽ cần thực hiện các thay đổi đối với mã C # trong dự án Unity.

Bây giờ bạn đã sẵn sàng để chơi MegaFrogRace! Amazon GameSparks tự động thiết lập danh tính người chơi trên máy tính của bạn và sử dụng lại danh tính này trên các phiên bản trò chơi đang chạy của bạn. Để chơi thử, hãy tạo một bản dựng trò chơi của bạn và sao chép nó vào một máy tính khác, sau đó khởi động trò chơi trên cả hai và nhấp vào nút “Amazon GameSparks” để bắt đầu yêu cầu mai mối trên cả hai máy tính. Sau một thời gian, bạn sẽ kết hợp với nhau và bắt đầu chơi!

Xin chúc mừng! Giờ đây, bạn đã triển khai và định cấu hình thành công trò chơi nhiều người chơi được lưu trữ trên Amazon GameLift, với Amazon GameSparks cung cấp chức năng phụ trợ trò chơi!

Xử lý sự cố

Nếu bạn gặp phải bất kỳ sự cố nào, đây là một số gợi ý về những điều cần kiểm tra:

  • Đảm bảo rằng bạn đã triển khai tất cả cơ sở hạ tầng (CDK stacks, GameSparks backend) ở US East 1 (N. Virginia) và chọn US East 1 trong GameSparks Connection Scriptable Object.
  • Kiểm tra xem bạn có bất kỳ thay đổi nào đối với cấu hình phụ trợ GameSparks chưa được triển khai hay không và nếu có, hãy triển khai chúng dưới dạng ảnh chụp nhanh mới.
  • Xác minh rằng vai trò IAM được GameSparks Dev Stage sử dụng là vai trò GameDeployment-MegaFrogRace. Nếu không, hãy thêm chính sách nội tuyến dành cho khách hàng của GameSparksBackend vào vai trò IAM hiện đang sử dụng của bạn.
  • Xác minh qua Amazon GameLift Console rằng SampleRealtimeFleet GameLift Fleet có ít nhất 1 máy chủ đang hoạt động. Nếu không, hãy kiểm tra tab Sự kiện để biết bất kỳ lỗi nào. Để gỡ lỗi thêm, bạn có thể cần phải truy cập từ xa phiên bản nhóm GameLift.

Phá hủy cơ sở hạ tầng đã triển khai

Nếu bạn đã kết thúc thử nghiệm cho ngày hôm nay và muốn ngừng sử dụng tài nguyên bạn đã tạo, hãy làm theo các bước sau để tránh phát sinh chi phí không mong muốn.

Xóa phần phụ trợ trò chơi GameSparks:

  • Mở AWS Management Console và điều hướng đến Amazon GameSparks Console
  • Trên bảng điều hướng bên trái, dưới MegaFrogRace, chọn Game Details
  • Chọn Delete
  • Làm theo lời nhắc trên màn hình để xác nhận việc xóa

Xóa CDK stack:

  • Chạy các lệnh sau từ kho lưu trữ git đã kiểm xuất:
cd packages/infra

yarn cdk destroy "*/MatchmakingMgmtStack"

yarn cdk destroy "*/MatchmakingStack"
  • Ngoài ra, bạn có thể xóa các CloudFormation stacks đã triển khai của mẫu thông qua bảng điều khiển dịch vụ CloudFormation trên AWS Management Console. Đảm bảo rằng bạn xóa MatchmakingMgmtStack trước MatchmakingStack.

Tóm tắt

Trong bài đăng trên blog này, bạn đã biết cách kết hợp Amazon GameSparks, Amazon GameLift Realtime Servers và GameLift FlexMatch để tạo một trò chơi nhiều người chơi trực tuyến session-based với backend functionality và matchmaking. Bạn đã triển khai một giải pháp mẫu vào tài khoản của riêng mình và định cấu hình tích hợp ứng dụng khách trò chơi.

Muốn tìm hiểu thêm? Hãy xem các tài nguyên bổ sung này để biết thêm thông tin về cách bạn có thể tạo trải nghiệm trò chơi (nhiều người chơi) của riêng mình trên AWS!


Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.