ไคลเอนต์ .NET สำหรับเซิร์ฟเวอร์ Nakama ที่เขียนด้วย C#
Nakama เป็นเซิร์ฟเวอร์โอเพ่นซอร์สที่ออกแบบมาเพื่อขับเคลื่อนเกมและแอปสมัยใหม่ คุณสมบัติต่างๆ ได้แก่ บัญชีผู้ใช้ แชท โซเชียล ระบบจับคู่ ผู้เล่นหลายคนแบบเรียลไทม์ และอื่นๆ อีกมากมาย
ไคลเอ็นต์นี้ใช้ตัวเลือก API และซ็อกเก็ตแบบเต็มกับเซิร์ฟเวอร์ เขียนด้วยภาษา C# โดยมีการพึ่งพาน้อยที่สุดเพื่อรองรับ Unity, Xamarin, Godot, XNA และเอ็นจิ้นและเฟรมเวิร์กอื่นๆ
เอกสารฉบับเต็มออนไลน์อยู่ - https://heroiclabs.com/docs
คุณจะต้องตั้งค่าเซิร์ฟเวอร์และฐานข้อมูลก่อนจึงจะสามารถเชื่อมต่อกับไคลเอนต์ได้ วิธีที่ง่ายที่สุดคือใช้ Docker แต่ดูเอกสารประกอบของเซิร์ฟเวอร์เพื่อดูตัวเลือกอื่นๆ
ติดตั้งและรันเซิร์ฟเวอร์ ทำตามคำแนะนำเหล่านี้
ดาวน์โหลดไคลเอนต์จากหน้าเผยแพร่และนำเข้าไปยังโปรเจ็กต์ของคุณ คุณสามารถสร้างจากแหล่งที่มาได้
ใช้ข้อมูลรับรองการเชื่อมต่อเพื่อสร้างวัตถุไคลเอนต์
// using Nakama;
const string scheme = "http" ;
const string host = "127.0.0.1" ;
const int port = 7350 ;
const string serverKey = "defaultkey" ;
var client = new Client ( scheme , host , port , serverKey ) ;
วัตถุไคลเอนต์มีวิธีการมากมายในการรันคุณสมบัติต่าง ๆ ในเซิร์ฟเวอร์หรือเปิดการเชื่อมต่อซ็อกเก็ตเรียลไทม์กับเซิร์ฟเวอร์
มีหลายวิธีในการตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ การรับรองความถูกต้องสามารถสร้างผู้ใช้ได้หากยังไม่มีข้อมูลประจำตัวเหล่านั้น นอกจากนี้ยังตรวจสอบสิทธิ์ได้อย่างง่ายดายด้วยโปรไฟล์โซเชียลจาก Google Play Games, Facebook, Game Center ฯลฯ
var email = "[email protected]" ;
var password = "batsignal" ;
var session = await client . AuthenticateEmailAsync ( email , password ) ;
System . Console . WriteLine ( session ) ;
เมื่อตรวจสอบสิทธิ์แล้ว เซิร์ฟเวอร์จะตอบสนองด้วยโทเค็นการรับรองความถูกต้อง (JWT) ซึ่งมีคุณสมบัติที่เป็นประโยชน์และได้รับการดีซีเรียลไลซ์ลงในอ็อบเจ็กต์ Session
System . Console . WriteLine ( session . AuthToken ) ; // raw JWT token
System . Console . WriteLine ( session . RefreshToken ) ; // raw JWT token.
System . Console . WriteLine ( session . UserId ) ;
System . Console . WriteLine ( session . Username ) ;
System . Console . WriteLine ( "Session has expired: {0}" , session . IsExpired ) ;
System . Console . WriteLine ( "Session expires at: {0}" , session . ExpireTime ) ;
ขอแนะนำให้จัดเก็บโทเค็นการตรวจสอบสิทธิ์จากเซสชันและตรวจสอบเมื่อเริ่มต้นระบบว่าหมดอายุแล้วหรือไม่ หากโทเค็นหมดอายุ คุณต้องตรวจสอบสิทธิ์อีกครั้ง เวลาหมดอายุของโทเค็นสามารถเปลี่ยนแปลงได้ตามการตั้งค่าในเซิร์ฟเวอร์
var authToken = "restored from somewhere" ;
var refreshToken = "restored from somewhere" ;
var session = Session . Restore ( authToken , refreshToken ) ;
// Check whether a session is close to expiry.
if ( session . HasExpired ( DateTime . UtcNow . AddDays ( 1 ) ) )
{
try
{
session = await client . SessionRefreshAsync ( session ) ;
}
catch ( ApiResponseException e )
{
System . Console . WriteLine ( "Session can no longer be refreshed. Must reauthenticate!" ) ;
}
}
ไคลเอนต์มี API ในตัวมากมายสำหรับคุณสมบัติต่าง ๆ ของเซิร์ฟเวอร์เกม สิ่งเหล่านี้สามารถเข้าถึงได้ด้วยวิธีอะซิงก์ นอกจากนี้ยังสามารถเรียกตรรกะแบบกำหนดเองในฟังก์ชัน RPC บนเซิร์ฟเวอร์ได้อีกด้วย สิ่งเหล่านี้สามารถดำเนินการได้ด้วยวัตถุซ็อกเก็ต
คำขอทั้งหมดจะถูกส่งไปพร้อมกับวัตถุเซสชันที่อนุญาตไคลเอ็นต์
var account = await client . GetAccountAsync ( session ) ;
System . Console . WriteLine ( account . User . Id ) ;
System . Console . WriteLine ( account . User . Username ) ;
System . Console . WriteLine ( account . Wallet ) ;
คำขอสามารถจัดเตรียมพร้อมกับการกำหนดค่าการลองใหม่ในกรณีที่เกิดข้อผิดพลาดของเครือข่ายหรือเซิร์ฟเวอร์ชั่วคราว
คุณสามารถใช้การกำหนดค่าเดียวเพื่อควบคุมพฤติกรรมการลองส่งคำขอใหม่ทั้งหมด:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;
หรือสามารถจัดเตรียมการกำหนดค่าตามคำขอได้:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;
การกำหนดค่าการลองใหม่ตามคำขอจะแทนที่การกำหนดค่าการลองใหม่ทั่วโลก
คำขอยังสามารถจัดเตรียมโทเค็นการยกเลิกได้ หากคุณต้องการยกเลิกระหว่างการเดินทาง:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledException
ไคลเอนต์สามารถสร้างซ็อกเก็ตอย่างน้อยหนึ่งซ็อกเก็ตกับเซิร์ฟเวอร์ แต่ละซ็อกเก็ตสามารถมีผู้ฟังเหตุการณ์ของตัวเองที่ลงทะเบียนเพื่อรับการตอบสนองจากเซิร์ฟเวอร์
var socket = Socket . From ( client ) ;
socket . Connected += ( ) =>
{
System . Console . WriteLine ( "Socket connected." ) ;
} ;
socket . Closed += ( ) =>
{
System . Console . WriteLine ( "Socket closed." ) ;
} ;
socket . ReceivedError += e => System . Console . WriteLine ( e ) ;
await socket . ConnectAsync ( session ) ;
Satori เป็นเซิร์ฟเวอร์ liveops สำหรับเกมที่ขับเคลื่อนการวิเคราะห์ที่ดำเนินการได้ การทดสอบ A/B และการกำหนดค่าระยะไกล ใช้ Satori .NET Client เพื่อสื่อสารกับ Satori จากภายในเกม .NET ของคุณ
เอกสารฉบับเต็มออนไลน์อยู่ - https://heroiclabs.com/docs/satori/client-libraries/unity/index.html
สร้างออบเจ็กต์ไคลเอนต์ที่ยอมรับ API ที่คุณได้รับในฐานะลูกค้า Satori
using Satori ;
const string scheme = "https" ;
const string host = "127.0.0.1" ; // add your host here
const int port = 443 ;
const string apiKey = "apiKey" ; // add the api key that was given to you as a Satori customer.
var client = new Client ( scheme , host , port , apiKey ) ;
จากนั้นตรวจสอบสิทธิ์กับเซิร์ฟเวอร์เพื่อรับเซสชันของคุณ
// Authenticate with the Satori server.
try
{
session = await client . AuthenticateAsync ( id ) ;
Debug . Log ( "Authenticated successfully." ) ;
}
catch ( ApiResponseException ex )
{
Debug . LogFormat ( "Error authenticating: {0}" , ex . Message ) ;
}
เมื่อใช้ไคลเอนต์ คุณสามารถรับการทดลองหรือแฟล็กฟีเจอร์ที่ผู้ใช้เป็นเจ้าของ
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;
คุณยังสามารถส่งเหตุการณ์ที่กำหนดเองไปยังเซิร์ฟเวอร์ได้:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;
นี่เป็นเพียงชุดย่อยของ Satori Client API ดังนั้นโปรดดูลิงก์เอกสารประกอบที่แสดงไว้ก่อนหน้านี้สำหรับ API แบบเต็ม
แผนงานการพัฒนาได้รับการจัดการตามปัญหา GitHub และยินดีรับคำขอดึง หากคุณสนใจที่จะปรับปรุงโค้ด โปรดเปิดประเด็นเพื่อหารือเกี่ยวกับการเปลี่ยนแปลงหรือแวะเข้ามาและหารือเกี่ยวกับเรื่องนี้ในฟอรัมชุมชน
สามารถสร้างโค้ดเบสได้ด้วย Dotnet CLI การขึ้นต่อกันทั้งหมดจะถูกดาวน์โหลดในขณะสร้างด้วย Nuget
dotnet build Nakama/Nakama.csproj
dotnet build Satori/Satori.csproj
สำหรับรุ่นรุ่นโปรดดูคำแนะนำของเรา:
หากต้องการรันการทดสอบ คุณจะต้องรันเซิร์ฟเวอร์และฐานข้อมูล การทดสอบส่วนใหญ่เขียนเป็นการทดสอบการรวมซึ่งดำเนินการกับเซิร์ฟเวอร์ วิธีที่รวดเร็วที่เราใช้กับเวิร์กโฟลว์ทดสอบของเราคือการใช้ไฟล์เขียน Docker ที่อธิบายไว้ในเอกสารประกอบ
docker-compose -f ./docker-compose-postgres.yml up
dotnet test Nakama.Tests/Nakama.Tests.csproj
หากต้องการรันการทดสอบเฉพาะ ให้ส่งชื่อแบบเต็มของวิธีการไปที่ dotnet test --filter
:
dotnet test --filter " Nakama.Tests.Api.GroupTest.ShouldPromoteAndDemoteUsers "
หากคุณต้องการแนบดีบักเกอร์ Visual Studio เข้ากับการทดสอบ ให้ตั้งค่า VSTEST_HOST_DEBUG
เป็น true
ในสภาพแวดล้อมเชลล์ของคุณและรัน dotnet test
แนบดีบักเกอร์เข้ากับกระบวนการที่ระบุโดยคอนโซล
เพื่อให้ผ่านการทดสอบสำหรับ Satori คอนโซล Satori จะต้องเต็มไปด้วยข้อมูลตัวอย่างที่มีอยู่ผ่านปุ่มใน GUI จากนั้นคุณสามารถทดสอบ SDK ด้วย dotnet test Satori.Tests/Satori.Tests.csproj
เอกสาร nakama-dotnet API ถูกสร้างขึ้นด้วย Doxygen และปรับใช้กับหน้า GitHub
เมื่อเปลี่ยนความคิดเห็นของ API ให้รัน Doxygen อีกครั้งและยอมรับการเปลี่ยนแปลงใน docs/*
วิธีเรียกใช้ Doxygen:
brew install doxygen
cd docs/
doxygen
โครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต Apache-2
ขอขอบคุณ Alex Parker (@zanders3) สำหรับไลบรารี json ที่ยอดเยี่ยมและ David Haig (@ninjasource) สำหรับ Ninja.WebSockets