นี่คืออสุจิ UnityEngine ของ Heroic Labs ที่มีห้องสมุดสำหรับการเข้าถึงบริการแบ็กเอนด์ที่แตกต่างกันสองแห่งคือ Nakama และ Satori
ลูกค้าถูกสร้างขึ้นบนไคลเอนต์. NET พร้อมส่วนขยายสำหรับเอ็นจิ้น Unity พวกเขาต้องการ. NET 4.6 Scripting Runtime เวอร์ชันเพื่อตั้งค่าในตัวแก้ไข
Nakama เป็นเซิร์ฟเวอร์โอเพนซอร์ซที่ออกแบบมาเพื่อเพิ่มพลังให้กับเกมและแอพที่ทันสมัย คุณสมบัติรวมถึงบัญชีผู้ใช้, แชท, โซเชียล, ผู้จับคู่, ผู้เล่นหลายคนแบบเรียลไทม์และอื่น ๆ อีกมากมาย
เอกสารฉบับเต็มคือออนไลน์-https://heroiclabs.com/docs/unity-client-guide
คุณจะต้องตั้งค่าเซิร์ฟเวอร์และฐานข้อมูลก่อนที่คุณจะสามารถเชื่อมต่อกับไคลเอนต์ วิธีที่ง่ายที่สุดคือการใช้ Docker แต่ดูเอกสารเซิร์ฟเวอร์สำหรับตัวเลือกอื่น ๆ
ติดตั้งและเรียกใช้เซิร์ฟเวอร์ ทำตามคำแนะนำเหล่านี้
ติดตั้ง Unity SDK คุณมีสามตัวเลือกสำหรับสิ่งนี้
หากต้องการใช้รีลีสอย่างเป็นทางการคุณสามารถดาวน์โหลด. unitypackage หรือ. tar จากหน้ารีลีสและนำเข้าสู่โครงการของคุณ หากคุณเลือกตัวเลือก. tar คุณสามารถนำเข้าจากแบบเลื่อนลงในหน้าต่าง Unity Package Manager
อีกทางเลือกหนึ่งหากคุณต้องการชำระเงินเฉพาะรุ่นหรือกระทำจาก GitHub และใช้ Unity 2019.4.1 หรือใหม่กว่าคุณสามารถเพิ่มสิ่งต่อไปนี้ลงในไฟล์ manifest.json ในโฟลเดอร์ Packages ของโครงการของคุณ:
"com.heroiclabs.nakama-unity" : " https://github.com/heroiclabs/nakama-unity.git?path=/Packages/Nakama#<commit | tag> "ตัวเลือกสุดท้ายของคุณคือการดาวน์โหลดไบนารี prebuilt จากร้านค้าสินทรัพย์
ใช้ข้อมูลรับรองการเชื่อมต่อเพื่อสร้างวัตถุไคลเอนต์
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 , UnityWebRequestAdapter . Instance ) ; วัตถุไคลเอนต์มีวิธีการมากมายในการดำเนินการคุณสมบัติต่าง ๆ ในเซิร์ฟเวอร์หรือเปิดการเชื่อมต่อซ็อกเก็ตเรียลไทม์กับเซิร์ฟเวอร์
มีหลายวิธีในการตรวจสอบกับเซิร์ฟเวอร์ การรับรองความถูกต้องสามารถสร้างผู้ใช้ได้หากพวกเขายังไม่มีอยู่กับข้อมูลรับรองเหล่านั้น นอกจากนี้ยังง่ายต่อการตรวจสอบด้วยโปรไฟล์โซเชียลจาก Google Play Games, Facebook, Game Center ฯลฯ
var deviceId = SystemInfo . deviceUniqueIdentifier ;
var session = await client . AuthenticateDeviceAsync ( deviceId ) ;
Debug . Log ( session ) ; เมื่อตรวจสอบความถูกต้องเซิร์ฟเวอร์ตอบกลับด้วยโทเค็นการรับรองความถูกต้อง (JWT) ซึ่งมีคุณสมบัติที่เป็นประโยชน์และได้รับ deserialized ลงในวัตถุ Session
Debug . Log ( session . AuthToken ) ; // raw JWT token
Debug . LogFormat ( "Session user id: '{0}'" , session . UserId ) ;
Debug . LogFormat ( "Session user username: '{0}'" , session . Username ) ;
Debug . LogFormat ( "Session has expired: {0}" , session . IsExpired ) ;
Debug . LogFormat ( "Session expires at: {0}" , session . ExpireTime ) ; // in seconds.ขอแนะนำให้จัดเก็บโทเค็น Auth จากเซสชันและตรวจสอบเมื่อเริ่มต้นว่าหมดอายุหรือไม่ หากโทเค็นหมดอายุคุณต้อง reuthenticate เวลาหมดอายุของโทเค็นสามารถเปลี่ยนแปลงได้เป็นการตั้งค่าในเซิร์ฟเวอร์
const string prefKeyName = "nakama.session" ;
ISession session ;
var authToken = PlayerPrefs . GetString ( prefKeyName ) ;
if ( string . IsNullOrEmpty ( authToken ) || ( session = Session . Restore ( authToken ) ) . IsExpired )
{
Debug . Log ( "Session has expired. Must reauthenticate!" ) ;
} ;
Debug . Log ( session ) ;ไคลเอนต์มี API ในตัวจำนวนมากสำหรับคุณสมบัติต่าง ๆ ของเซิร์ฟเวอร์เกม สิ่งเหล่านี้สามารถเข้าถึงได้ด้วยวิธีการ Async นอกจากนี้ยังสามารถเรียกตรรกะที่กำหนดเองเป็นฟังก์ชั่น RPC บนเซิร์ฟเวอร์ สิ่งเหล่านี้ยังสามารถดำเนินการกับวัตถุซ็อกเก็ต
คำขอทั้งหมดจะถูกส่งด้วยวัตถุเซสชันที่อนุญาตให้ลูกค้า
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
Debug . LogFormat ( "User username: '{0}'" , account . User . Username ) ;
Debug . LogFormat ( "Account virtual wallet: '{0}'" , account . Wallet ) ;คำขอสามารถจัดหาได้ด้วยการกำหนดค่าลองอีกครั้งในกรณีของข้อผิดพลาดของเครือข่ายชั่วคราวหรือเซิร์ฟเวอร์
การกำหนดค่าเดียวสามารถใช้เพื่อควบคุมพฤติกรรมการร้องขอทั้งหมด:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;หรือการกำหนดค่าสามารถจัดหาได้ตามความต้องการ:
var retryConfiguration = new RetryConfiguration ( baseDelay : 1 , 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 = client . NewSocket ( ) ;
socket . Connected += ( ) => Debug . Log ( "Socket connected." ) ;
socket . Closed += ( ) => Debug . Log ( "Socket closed." ) ;
await socket . ConnectAsync ( session ) ; หากคุณต้องการให้ตัวจัดการซ็อกเก็ตดำเนินการกระทู้หลักของ Unity Outside Unity ให้ผ่าน useMainThread: false อาร์กิวเมนต์:
var socket = client . NewSocket ( useMainThread : false ) ; คุณสามารถจับข้อผิดพลาดเมื่อคุณใช้การ await ด้วยงานใน C#
try
{
var account = await client . GetAccountAsync ( session ) ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
}
catch ( ApiResponseException e )
{
Debug . LogFormat ( "{0}" , e ) ;
} คุณสามารถหลีกเลี่ยงการใช้ await ที่ซึ่งข้อยกเว้นจะต้องถูกจับและใช้ Task.ContinueWith(...) เป็นสไตล์การโทรกลับที่มีมาตรฐาน C# หากคุณต้องการ
client . GetAccountAsync ( session ) . ContinueWith ( t =>
{
if ( t . IsFaulted || t . IsCanceled )
{
Debug . LogFormat ( "{0}" , t . Exception ) ;
return ;
}
var account = t . Result ;
Debug . LogFormat ( "User id: '{0}'" , account . User . Id ) ;
} ) ;Satori เป็นเซิร์ฟเวอร์ LiveOps สำหรับเกมที่ให้อำนาจการวิเคราะห์ที่สามารถดำเนินการได้การทดสอบ A/B และการกำหนดค่าระยะไกล ใช้ไคลเอนต์ Satori Unity เพื่อ coomunicate กับ Satori จากภายในเกม Unity ของคุณ
เอกสารฉบับเต็มคือออนไลน์ - https://heroiclabs.com/docs/satori/client-libraries/unity
สร้างวัตถุลูกค้าที่ยอมรับ 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 ) ) ;นี่เป็นเพียงส่วนย่อยของ API ไคลเอนต์ Satori ดังนั้นโปรดดูลิงก์เอกสารที่แสดงไว้ก่อนหน้านี้สำหรับ API เต็มรูปแบบ
สำหรับการสร้างทั้ง Nakama และ Satori WebGL คุณควรตรวจสอบให้แน่ใจว่า IHttpAdapter ส่งผ่านไปยังลูกค้าเป็น UnityWebRequestAdapter
var client = new Client ( "defaultkey" , UnityWebRequestAdapter . Instance ) ; สำหรับ Nakama ให้ใช้วิธีการขยาย NewSocket() เพื่อสร้างซ็อกเก็ตหรือตั้งค่า ISocketAdapter ที่ถูกต้องด้วยตนเองต่อแพลตฟอร์ม
var socket = client . NewSocket ( ) ;
// or
#if UNITY_WEBGL && ! UNITY_EDITOR
ISocketAdapter adapter = new JsWebSocketAdapter ( ) ;
#else
ISocketAdapter adapter = new WebSocketAdapter ( ) ;
#endif
var socket = Socket . From ( client , adapter ) ;เมื่อทดสอบตัวอย่างของ WebGL ก่อนปี 2021.1 อย่าลืมเข้าไปในการตั้งค่าการสร้างและตั้งค่าการกำหนดค่าคอมไพเลอร์ C ++ เพื่อเปิดตัวแทนที่จะดีบักเนื่องจากปัญหาที่โดดเด่นใน Unity WebGL Builds: https://issuetracker.unity3d.com/issues/webgl-build-throws-threads-are-not-enabled-for- this-platform-error-when-programs-built-using-debug-c-plus-plus-plus-compiler-configuration
แผนงานการพัฒนาได้รับการจัดการเป็นปัญหาของ GitHub และยินดีต้อนรับคำขอดึง หากคุณสนใจที่จะปรับปรุงรหัสโปรดเปิดปัญหาเพื่อหารือเกี่ยวกับการเปลี่ยนแปลงหรือลดลงและหารือในฟอรัมชุมชน
โครงการนี้สามารถเปิดในความสามัคคีเพื่อสร้าง ".UnityPackage"
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต Apache-2