VOOZH about

URL: https://www.nuget.org/packages/GameFrameX.NetWork.Kcp/

โ‡ฑ NuGet Gallery | GameFrameX.NetWork.Kcp 1.5.1


๏ปฟ

๐Ÿ‘ Image
GameFrameX.NetWork.Kcp 1.5.1

dotnet add package GameFrameX.NetWork.Kcp --version 1.5.1
 
 
NuGet\Install-Package GameFrameX.NetWork.Kcp -Version 1.5.1
 
 
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="GameFrameX.NetWork.Kcp" Version="1.5.1" />
 
 
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="GameFrameX.NetWork.Kcp" Version="1.5.1" />
 
Directory.Packages.props
<PackageReference Include="GameFrameX.NetWork.Kcp" />
 
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add GameFrameX.NetWork.Kcp --version 1.5.1
 
 
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: GameFrameX.NetWork.Kcp, 1.5.1"
 
 
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package GameFrameX.NetWork.Kcp@1.5.1
 
 
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=GameFrameX.NetWork.Kcp&version=1.5.1
 
Install as a Cake Addin
#tool nuget:?package=GameFrameX.NetWork.Kcp&version=1.5.1
 
Install as a Cake Tool
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

GameFrameX

้ซ˜ๆ€ง่ƒฝใ€่ทจๅนณๅฐ็š„ๆธธๆˆๆœๅŠกๅ™จๆก†ๆžถ

๐Ÿ‘ .NET

๐ŸŽฏ ๆก†ๆžถ็ฎ€ไป‹

GameFrameX ๆ˜ฏไธ€ไธชๅŸบไบŽ C# .NET 8.0 ๅผ€ๅ‘็š„้ซ˜ๆ€ง่ƒฝใ€่ทจๅนณๅฐๆธธๆˆๆœๅŠกๅ™จๆก†ๆžถ๏ผŒ้‡‡็”จ Actor ๆจกๅž‹่ฎพ่ฎก๏ผŒๆ”ฏๆŒ็ƒญๆ›ดๆ–ฐๆœบๅˆถใ€‚ไธ“ไธบๅคšไบบๅœจ็บฟๆธธๆˆๅผ€ๅ‘่€Œ่ฎพ่ฎก๏ผŒๅฎŒ็พŽๆ”ฏๆŒ Unity3D ๅฎขๆˆท็ซฏ้›†ๆˆใ€‚

่ฎพ่ฎก็†ๅฟต๏ผšๅคง้“่‡ณ็ฎ€๏ผŒไปฅ็ฎ€ๅŒ–็น

โœจ ๆ ธๅฟƒ็‰นๆ€ง

๐Ÿš€ ้ซ˜ๆ€ง่ƒฝๆžถๆž„
  • Actor ๆจกๅž‹๏ผšๅŸบไบŽ TPL DataFlow ๆž„ๅปบ็š„ๆ— ้”้ซ˜ๅนถๅ‘็ณป็ปŸ
  • ้›ถ้”่ฎพ่ฎก๏ผš้€š่ฟ‡ๆถˆๆฏไผ ้€’ๆœบๅˆถ้ฟๅ…ไผ ็ปŸ้”ๆ€ง่ƒฝๆŸ่€—
  • ๅ…จๅผ‚ๆญฅ็ผ–็จ‹๏ผšๅฎŒๆ•ด็š„ async/await ๅผ‚ๆญฅ็ผ–็จ‹ๆจกๅž‹
  • ๅ†…ๅญ˜ไผ˜ๅŒ–๏ผš่‡ชๅŠจๅžƒๅœพๅ›žๆ”ถๅ’Œๅฏน่ฑกๆฑ ็ฎก็†
๐Ÿ”„ ็ƒญๆ›ดๆ–ฐ็ณป็ปŸ
  • ้›ถๅœๆœบๆ›ดๆ–ฐ๏ผš่ฟ่กŒๆ—ถ้€ป่พ‘ๆ›ดๆ–ฐ๏ผŒๆ— ้œ€ๅœๆญขๆœๅŠก
  • ็Šถๆ€้€ป่พ‘ๅˆ†็ฆป๏ผšๆŒไน…ๅŒ–็Šถๆ€ๆ•ฐๆฎไธŽๅฏ็ƒญๆ›ดไธšๅŠก้€ป่พ‘ๅˆ†็ฆป
  • ๅ›žๆปšไฟๆŠค๏ผšๆ›ดๆ–ฐๅคฑ่ดฅ่‡ชๅŠจๅ›žๆปšๅˆฐ็จณๅฎš็‰ˆๆœฌ
  • ็‰ˆๆœฌ็ฎก็†๏ผšๆ”ฏๆŒ็จ‹ๅบ้›†็‰ˆๆœฌๆŽงๅˆถๅ’Œๅ›ž้€€ๅŠŸ่ƒฝ
๐ŸŒ ๅคšๅ่ฎฎ็ฝ‘็ปœ้€šไฟก
  • TCP/UDP/WebSocket/HTTP๏ผšๅ…จ้ข็š„ๅ่ฎฎๆ”ฏๆŒ
  • SuperSocket ้›†ๆˆ๏ผš้ซ˜ๆ€ง่ƒฝๅผ‚ๆญฅ I/O ๆจกๅž‹
  • ๆถˆๆฏๅˆ†ๅธง๏ผšๅ†…็ฝฎๆ•ฐๆฎๅŒ…ๅค„็†ๅ’Œๆต้‡ๆŽงๅˆถ
  • SSL/TLS ๅŠ ๅฏ†๏ผšๅฎ‰ๅ…จ้€šไฟก้€š้“ๆ”ฏๆŒ
  • ่ฟžๆŽฅๆฑ ๏ผšไผ˜ๅŒ–็š„่ต„ๆบๅˆฉ็”จ็އ
๐Ÿ’พ ๆ•ฐๆฎๅบ“ไธŽๆŒไน…ๅŒ–
  • MongoDB ไธปๆ•ฐๆฎๅบ“๏ผšๅฎŒๆ•ด็š„ MongoDB ้›†ๆˆๅ’Œ่ฟžๆŽฅๆฑ ็ฎก็†
  • ้€ๆ˜ŽๆŒไน…ๅŒ–๏ผš่‡ชๅŠจๅบๅˆ—ๅŒ–/ๅๅบๅˆ—ๅŒ–๏ผŒๅผ€ๅ‘่€…ๆ— ๆ„Ÿ็Ÿฅ
  • ็Šถๆ€็ฎก็†๏ผšๆ™บ่ƒฝ็ผ“ๅญ˜ๅ’Œ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†
  • ๆ‰น้‡ๆ“ไฝœ๏ผš้ซ˜ๆ€ง่ƒฝๆ‰น้‡ๅค„็†
๐Ÿ“Š ็›‘ๆŽงไธŽๅฏ่ง‚ๆต‹ๆ€ง
  • OpenTelemetry๏ผšๅ…จ้ข็š„ๆŒ‡ๆ ‡ใ€่ฟฝ่ธชๅ’Œๆ—ฅๅฟ—
  • Grafana ้›†ๆˆ๏ผšๅ†…็ฝฎไปช่กจๆฟๅ’Œๅ‘Š่ญฆๆ”ฏๆŒ
  • Prometheus ๅฏผๅ‡บ๏ผšๅŽŸ็”ŸๆŒ‡ๆ ‡ๅฏผๅ‡บๅŠŸ่ƒฝ
  • ๅฅๅบทๆฃ€ๆŸฅ๏ผšๅฎžๆ—ถ็ณป็ปŸๅฅๅบท็›‘ๆŽง
  • ๆ€ง่ƒฝๆŒ‡ๆ ‡๏ผšๆ•ฐๆฎๅบ“ใ€็ฝ‘็ปœๅ’ŒไธšๅŠก้€ป่พ‘็›‘ๆŽง

๐Ÿ—๏ธ ็ณป็ปŸๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๅฎขๆˆท็ซฏๅฑ‚ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ็ฝ‘็ปœๅฑ‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ TCP โ”‚ โ”‚ WebSocket โ”‚ โ”‚ HTTP โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๆถˆๆฏๅค„็†ๅฑ‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ๆถˆๆฏๅค„็†ๅ™จ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Actor ๅฑ‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ็Žฉๅฎถ โ”‚ โ”‚ ๆœๅŠกๅ™จ โ”‚ โ”‚ ่ดฆๆˆท โ”‚ โ”‚
โ”‚ โ”‚ Actor โ”‚ โ”‚ Actor โ”‚ โ”‚ Actor โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ็ป„ไปถๅฑ‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ็ป„ไปถ โ”‚ โ”‚ ็ป„ไปถ โ”‚ โ”‚ ็ป„ไปถ โ”‚ โ”‚
โ”‚ โ”‚ + ็Šถๆ€ โ”‚ โ”‚ + ็Šถๆ€ โ”‚ โ”‚ + ็Šถๆ€ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ๆ•ฐๆฎๅบ“ๅฑ‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ MongoDB โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

็Žฏๅขƒ่ฆๆฑ‚
ๅฎ‰่ฃ…ๆญฅ้ชค
  1. ๅ…‹้š†ไป“ๅบ“

    git clone https://github.com/GameFrameX/GameFrameX.git
    cd GameFrameX
    
  2. ่ฟ˜ๅŽŸไพ่ต–

    dotnet restore
    
  3. ้…็ฝฎๆ•ฐๆฎๅบ“

    • ๅฏๅŠจ MongoDB ๆœๅŠก
    • ๆ›ดๆ–ฐ้…็ฝฎๆ–‡ไปถไธญ็š„่ฟžๆŽฅๅญ—็ฌฆไธฒ
  4. ๆž„ๅปบ่ฟ่กŒ

    dotnet build
    dotnet run --project GameFrameX.Launcher --ServerType=Game --ServerId=1000
    
  5. ้ชŒ่ฏ้ƒจ็ฝฒ

    • ๆฃ€ๆŸฅๅฅๅบท็ซฏ็‚น๏ผšhttp://localhost:29090/health
    • ๆŸฅ็œ‹ๆ—ฅๅฟ—็กฎ่ฎคๅฏๅŠจๆˆๅŠŸ

๐Ÿ“ ้กน็›ฎ็ป“ๆž„

GameFrameX/
โ”œโ”€โ”€ GameFrameX.Apps/ # ๅบ”็”จๅฑ‚๏ผˆ็Šถๆ€ๆ•ฐๆฎ๏ผ‰
โ”‚ โ”œโ”€โ”€ Account/ # ่ดฆๆˆทๆจกๅ—็Šถๆ€
โ”‚ โ”œโ”€โ”€ Player/ # ็Žฉๅฎถๆจกๅ—็Šถๆ€
โ”‚ โ””โ”€โ”€ Server/ # ๆœๅŠกๅ™จๆจกๅ—็Šถๆ€
โ”œโ”€โ”€ GameFrameX.Hotfix/ # ็ƒญๆ›ดๆ–ฐๅฑ‚๏ผˆไธšๅŠก้€ป่พ‘๏ผ‰
โ”‚ โ”œโ”€โ”€ Logic/ # ไธšๅŠก้€ป่พ‘ๅฎž็Žฐ
โ”‚ โ””โ”€โ”€ StartUp/ # ็ƒญๆ›ดๆ–ฐๅฏๅŠจ้€ป่พ‘
โ”œโ”€โ”€ GameFrameX.Core/ # ๆ ธๅฟƒๆก†ๆžถ
โ”‚ โ”œโ”€โ”€ Actors/ # Actor ็ณป็ปŸๅฎž็Žฐ
โ”‚ โ”œโ”€โ”€ Components/ # ็ป„ไปถ็ณป็ปŸ
โ”‚ โ””โ”€โ”€ Events/ # ไบ‹ไปถ็ณป็ปŸ
โ”œโ”€โ”€ GameFrameX.NetWork/ # ็ฝ‘็ปœ้€šไฟก
โ”œโ”€โ”€ GameFrameX.DataBase.Mongo/ # MongoDB ้›†ๆˆ
โ”œโ”€โ”€ GameFrameX.Config/ # ้…็ฝฎ็ฎก็†
โ”œโ”€โ”€ GameFrameX.Monitor/ # ็›‘ๆŽงๅ’ŒๆŒ‡ๆ ‡
โ”œโ”€โ”€ GameFrameX.Launcher/ # ๅบ”็”จๅ…ฅๅฃ็‚น
โ””โ”€โ”€ GameFrameX.StartUp/ # ๅฏๅŠจ็ผ–ๆŽ’

๐Ÿ”ง ไธšๅŠก้€ป่พ‘ๅผ€ๅ‘

ๅŸบ็ก€็คบไพ‹๏ผšHello World

ๅฟซ้€Ÿๅˆ›ๅปบไธ€ไธช HTTP ๆŽฅๅฃๆฅไฝ“้ชŒๅผ€ๅ‘ๆต็จ‹ใ€‚

using GameFrameX.NetWork.HTTP;

[HttpMessageMapping(typeof(TestHttpHandler))]
[HttpMessageResponse(typeof(HttpTestResponse))]
[Description("Hello World ็คบไพ‹ๆŽฅๅฃ")]
public sealed class TestHttpHandler : BaseHttpHandler
{
 public override Task<string> Action(string ip, string url, Dictionary<string, object> parameters)
 {
 var response = new HttpTestResponse
 {
 Message = "Hello World From GameFrameX",
 Time = DateTime.Now
 };
 // ่ฟ”ๅ›žๆ ‡ๅ‡† JSON ๆ ผๅผ
 return Task.FromResult(HttpJsonResult.SuccessString(response));
 }
}

public sealed class HttpTestResponse : HttpMessageResponseBase
{
 public string Message { get; set; }
 public DateTime Time { get; set; }
}
็ป„ไปถ-ไปฃ็†ๆจกๅผ

1. ๅฎšไน‰็Šถๆ€๏ผˆApps ๅฑ‚ - ไธๅฏ็ƒญๆ›ด๏ผ‰

public class BagState : CacheState
{
 public List<ItemData> Items { get; set; } = new();
 public int MaxSlots { get; set; } = 50;
}

2. ๅˆ›ๅปบ็ป„ไปถ๏ผˆApps ๅฑ‚๏ผ‰

public class BagComponent : StateComponent<BagState>
{
 // ็ป„ไปถๅˆๅง‹ๅŒ–้€ป่พ‘
 protected override async Task OnInit()
 {
 await base.OnInit();
 // ๅˆๅง‹ๅŒ–็ป„ไปถ็Šถๆ€
 }
}

3. ๅฎž็ŽฐไธšๅŠก้€ป่พ‘๏ผˆHotfix ๅฑ‚ - ๅฏ็ƒญๆ›ด๏ผ‰

public class BagComponentAgent : StateComponentAgent<BagComponent, BagState>
{
 public async Task<bool> AddItem(int itemId, int count)
 {
 if (State.Items.Count >= State.MaxSlots)
 return false;

 var item = new ItemData { Id = itemId, Count = count };
 State.Items.Add(item);

 await Save();
 return true;
 }
}
ๆถˆๆฏๅค„็†ๅ™จๆจกๅผ

HTTP ๅค„็†ๅ™จ็คบไพ‹๏ผš

[HttpMessageMapping(typeof(GetPlayerInventoryHttpHandler))]
[Description("่Žทๅ–็Žฉๅฎถ่ƒŒๅŒ…็‰ฉๅ“")]
public sealed class GetPlayerInventoryHttpHandler : BaseHttpHandler
{
 public override async Task<MessageObject> Action(string ip, string url, Dictionary<string, object> parameters, MessageObject messageObject)
 {
 var request = (GetPlayerInventoryRequest)messageObject;
 var response = new GetPlayerInventoryResponse();

 // ไปŽๅ‚ๆ•ฐไธญ่Žทๅ–็ŽฉๅฎถID
 if (!parameters.TryGetValue("playerId", out var playerIdObj))
 {
 response.ErrorCode = (int)ResultCode.InvalidParameter;
 return response;
 }

 var playerId = Convert.ToInt64(playerIdObj);
 var bagAgent = await ActorManager.GetComponentAgent<BagComponentAgent>(playerId);

 if (bagAgent == null)
 {
 response.ErrorCode = (int)ResultCode.PlayerNotFound;
 return response;
 }

 var items = await bagAgent.GetItems();
 response.Items = items;
 return response;
 }
}

RPC ๅค„็†ๅ™จ็คบไพ‹๏ผš

[MessageMapping(typeof(ReqAddItem))]
internal sealed class AddItemHandler : PlayerRpcComponentHandler<BagComponentAgent, ReqAddItem, RespAddItem>
{
 protected override async Task ActionAsync(ReqAddItem request, RespAddItem response)
 {
 try
 {
 // ComponentAgent ็”ฑๅŸบ็ฑป่‡ชๅŠจๆณจๅ…ฅ,ๆ— ้œ€ๆ‰‹ๅŠจ่Žทๅ–
 await ComponentAgent.AddItem(request, response);
 }
 catch (Exception e)
 {
 LogHelper.Fatal(e);
 response.ErrorCode = (int)OperationStatusCode.InternalServerError;
 }
 }
}
ไบ‹ไปถๅค„็†ๆจกๅผ
[Event(EventId.PlayerLogin)]
internal sealed class PlayerLoginEventHandler : EventListener<PlayerComponentAgent>
{
 protected override Task HandleEvent(PlayerComponentAgent agent, GameEventArgs gameEventArgs)
 {
 if (agent == null)
 {
 LogHelper.Error("ไปฃ็†ๅฏน่ฑกไธบ็ฉบ");
 return Task.CompletedTask;
 }

 // ๅค„็†็™ปๅฝ•ไบ‹ไปถ้€ป่พ‘
 return agent.OnLogin();
 }
}

๐Ÿ”„ ็ƒญๆ›ดๆ–ฐๆœบๅˆถ

ๆžถๆž„ๆฆ‚่ฟฐ

็ƒญๆ›ดๆ–ฐ็ณป็ปŸๅฐ†็Šถๆ€๏ผˆๆŒไน…ๅŒ–ๆ•ฐๆฎ๏ผ‰ไธŽ้€ป่พ‘๏ผˆไธšๅŠก่ง„ๅˆ™๏ผ‰ๅˆ†็ฆป๏ผš

  1. Apps ๅฑ‚๏ผšๅŒ…ๅซ็Šถๆ€ๅฎšไน‰ๅ’Œ็ป„ไปถๅค–ๅฃณ๏ผˆไธๅฏ็ƒญๆ›ด๏ผ‰
  2. Hotfix ๅฑ‚๏ผšๅŒ…ๅซไธšๅŠก้€ป่พ‘ๅฎž็Žฐ๏ผˆๅฏ็ƒญๆ›ด๏ผ‰
  3. ไปฃ็†ๆจกๅผ๏ผšไฝœไธบ็Šถๆ€ๅ’Œ้€ป่พ‘ไน‹้—ด็š„ๆกฅๆข
็ƒญๆ›ดๆ–ฐๆต็จ‹
  1. ็ผ–่ฏ‘ๆ–ฐ้€ป่พ‘๏ผšๆž„ๅปบๆ›ดๆ–ฐ็š„ GameFrameX.Hotfix.dll
  2. ้ƒจ็ฝฒ็จ‹ๅบ้›†๏ผšๅคๅˆถๅˆฐ /hotfix ็›ฎๅฝ•
  3. ่งฆๅ‘้‡่ฝฝ๏ผš้€š่ฟ‡ HTTP ็ซฏ็‚นๆˆ–ๆ–‡ไปถ็›‘่ง†ๅ™จ
  4. ไผ˜้›…่ฟ‡ๆธก๏ผšๆ–ฐ่ฏทๆฑ‚ไฝฟ็”จๆ›ดๆ–ฐๅŽ็š„้€ป่พ‘
  5. ๅ›žๆปšๆ”ฏๆŒ๏ผšๅคฑ่ดฅๆ—ถ่‡ชๅŠจๅ›žๆปš
็ƒญๆ›ดๆ–ฐ API
# ้€š่ฟ‡ HTTP ่งฆๅ‘็ƒญๆ›ดๆ–ฐ
curl -X POST http://localhost:29090/api/reload

# ๆฃ€ๆŸฅ้‡่ฝฝ็Šถๆ€
curl http://localhost:29090/api/reload/status

๐Ÿ“Š ้…็ฝฎ็ฎก็†

GameFrameX ไฝฟ็”จๆ‰ๅนณๅŒ–็š„้…็ฝฎ็ป“ๆž„๏ผŒๆ”ฏๆŒๅ‘ฝไปค่กŒๅ‚ๆ•ฐ (--Key=Value)ใ€็Žฏๅขƒๅ˜้‡ (Key=Value) ๅ’Œ appsettings.json ้…็ฝฎๆ–‡ไปถใ€‚

ๆ ธๅฟƒ้…็ฝฎ (Server)
้…็ฝฎ้กน ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ ็คบไพ‹
ServerType ๆœๅŠกๅ™จ็ฑปๅž‹ (ๅฆ‚ Game, Gate) ๆ—  Game
ServerId ๆœๅŠกๅ™จๅ”ฏไธ€ๆ ‡่ฏ† ID ๆ—  1000
ServerName ๆœๅŠกๅ™จๅ็งฐ ๅŒ ServerType Game-1
MinModuleId ไธšๅŠกๆจกๅ—่ตทๅง‹ ID 0 100
MaxModuleId ไธšๅŠกๆจกๅ—็ป“ๆŸ ID 0 1000
็ฝ‘็ปœ้…็ฝฎ (Network)
้…็ฝฎ้กน ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ ็คบไพ‹
InnerHost ๅ†…้ƒจ้€šไฟก IP (้›†็พค้—ด) ๆ—  0.0.0.0
InnerPort ๅ†…้ƒจ้€šไฟก็ซฏๅฃ ๆ—  29100
OuterHost ๅค–้ƒจ้€šไฟก IP (้ขๅ‘ๅฎขๆˆท็ซฏ) ๆ—  0.0.0.0
OuterPort ๅค–้ƒจ้€šไฟก็ซฏๅฃ ๆ—  29200
HttpPort HTTP ๆœๅŠก็ซฏๅฃ 0 8080
WsPort WebSocket ๆœๅŠก็ซฏๅฃ 0 29300
ๆ•ฐๆฎๅบ“้…็ฝฎ (Database)
้…็ฝฎ้กน ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ ็คบไพ‹
DataBaseUrl MongoDB ่ฟžๆŽฅๅญ—็ฌฆไธฒ ๆ—  mongodb://localhost:27017
DataBaseName ๆ•ฐๆฎๅบ“ๅ็งฐ ๆ—  gameframex
็›‘ๆŽง้…็ฝฎ (Monitoring)
้…็ฝฎ้กน ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ ็คบไพ‹
IsOpenTelemetry ๆ˜ฏๅฆๅฏ็”จ OpenTelemetry false true
MetricsPort Prometheus ๆŒ‡ๆ ‡็ซฏๅฃ 0 (ๅค็”จ HTTP) 9090
IsDebug ๅผ€ๅฏ่ฐƒ่ฏ•ๆ—ฅๅฟ— false true
ๅฏๅŠจๅ‘ฝไปค็คบไพ‹
dotnet GameFrameX.Launcher.dll \
 --ServerType=Game \
 --ServerId=1000 \
 --OuterPort=10000 \
 --DataBaseUrl=mongodb://127.0.0.1:27017 \
 --DataBaseName=game_db

๐Ÿณ Docker ้ƒจ็ฝฒ

# ๆž„ๅปบ้˜ถๆฎต
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore && dotnet build -c Release

# ่ฟ่กŒ้˜ถๆฎต
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /src/bin/Release/net8.0/ .
EXPOSE 29100 29110 29090
ENTRYPOINT ["dotnet", "GameFrameX.Launcher.dll"]
# docker-compose.yml
version: '3.8'
services:
 gameframex:
 build: .
 ports:
 - "29100:29100" # TCP
 - "29110:29110" # WebSocket
 - "29090:29090" # ๆŒ‡ๆ ‡
 environment:
 - ServerType=Game
 - ServerId=1000
 - DataBaseUrl=mongodb://mongodb:27017
 depends_on:
 - mongodb

 mongodb:
 image: mongo:6.0
 ports:
 - "27017:27017"
 volumes:
 - mongodb_data:/data/db

volumes:
 mongodb_data:

๐Ÿ” ็›‘ๆŽงไธŽๅฏ่ง‚ๆต‹ๆ€ง

ๆŒ‡ๆ ‡็ซฏ็‚น
  • ๅฅๅบทๆฃ€ๆŸฅ๏ผšhttp://localhost:29090/health
  • Prometheus ๆŒ‡ๆ ‡๏ผšhttp://localhost:29090/metrics
  • Grafana ไปช่กจๆฟ๏ผšๅฏ้€š่ฟ‡็Žฏๅขƒ้…็ฝฎ
ๅ…ณ้”ฎๆŒ‡ๆ ‡
  • ๆ•ฐๆฎๅบ“๏ผšๆŸฅ่ฏขๆฌกๆ•ฐใ€ๆŒ็ปญๆ—ถ้—ดใ€่ฟžๆŽฅๆฑ ็Šถๆ€
  • ็ฝ‘็ปœ๏ผš่ฟžๆŽฅๆ•ฐใ€ๆถˆๆฏๅžๅ้‡ใ€ๅญ—่Š‚ไผ ่พ“้‡
  • ไธšๅŠก๏ผš็Žฉๅฎถ็™ปๅฝ•ใ€ๆดป่ทƒไผš่ฏใ€ๆธธๆˆ็‰นๅฎšๆŒ‡ๆ ‡
  • ็ณป็ปŸ๏ผšCPUใ€ๅ†…ๅญ˜ใ€GC ๆ€ง่ƒฝใ€็บฟ็จ‹ๆฑ ็Šถๆ€

๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

ๆˆ‘ไปฌๆฌข่ฟŽไปปไฝ•ๅฝขๅผ็š„่ดก็Œฎ๏ผๅฆ‚ๆžœไฝ ๆƒณไธบ GameFrameX ๅšๅ‡บ่ดก็Œฎ๏ผŒ่ฏท้ตๅพชไปฅไธ‹ๆญฅ้ชค๏ผš

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบๅŠŸ่ƒฝๅˆ†ๆ”ฏ๏ผˆgit checkout -b feature/amazing-feature๏ผ‰
  3. ๆไบคๆ›ดๆ”น๏ผˆgit commit -m 'ๆทปๅŠ ๆŸไธชๅŠŸ่ƒฝ'๏ผ‰
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ๏ผˆgit push origin feature/amazing-feature๏ผ‰
  5. ๅˆ›ๅปบ Pull Request

๐Ÿ“„ ่ฎธๅฏ่ฏ

ๆœฌ้กน็›ฎ้‡‡็”จ Apache License 2.0 ่ฎธๅฏ่ฏ - ่ฏฆ่ง ๆ–‡ไปถใ€‚

๐Ÿ”— ็›ธๅ…ณ้“พๆŽฅ


<div align="center">

ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนไฝ ๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ๆˆ‘ไปฌไธ€ไธช โญ

Made with โค๏ธ by GameFrameX Team

</div>

Product Versions Compatible and additional computed target framework versions.
.NET net10.0 net10.0 is compatible.  net10.0-android net10.0-android was computed.  net10.0-browser net10.0-browser was computed.  net10.0-ios net10.0-ios was computed.  net10.0-maccatalyst net10.0-maccatalyst was computed.  net10.0-macos net10.0-macos was computed.  net10.0-tvos net10.0-tvos was computed.  net10.0-windows net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.5.1 131 3/24/2026
1.5.0 132 3/24/2026