VOOZH about

URL: https://www.nuget.org/packages/GameFrameX.Config/

โ‡ฑ NuGet Gallery | GameFrameX.Config 1.0.0


๏ปฟ

๐Ÿ‘ Image
GameFrameX.Config 1.0.0

dotnet add package GameFrameX.Config --version 1.0.0
 
 
NuGet\Install-Package GameFrameX.Config -Version 1.0.0
 
 
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.Config" Version="1.0.0" />
 
 
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="GameFrameX.Config" Version="1.0.0" />
 
Directory.Packages.props
<PackageReference Include="GameFrameX.Config" />
 
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.Config --version 1.0.0
 
 
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: GameFrameX.Config, 1.0.0"
 
 
#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.Config@1.0.0
 
 
#: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.Config&version=1.0.0
 
Install as a Cake Addin
#tool nuget:?package=GameFrameX.Config&version=1.0.0
 
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 (2)

Showing the top 2 NuGet packages that depend on GameFrameX.Config:

Package Downloads
GameFrameX.Launcher

Package Description

GameFrameX.Hotfix

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 162 2/24/2026