qq362946/fantasy/fantasy-net
- community
Checking that the SKILL.md file is still in the repository.
This guide applies to development and code review for Fantasy / Fantasy.Net / Fantasy.Unity written in C#. Use it when a task involves Fantasy server code or Unity client code using Fantasy, ECS entities/components/systems, scenes and subscenes, FTask, network handlers/messages/protocols, Address or Roaming routing, Control Center and service discovery, Kubernetes deployment and Pod DNS binding, Namespace/WorldGroup/World isolation, dynamic Scene registration or routing, cross-server events and subscriptions, Fantasy.config, scene or database access, HTTP controllers/services, session or client connection logic, or distributed runtime architecture. It may also be used for Fantasy-related code review, troubleshooting, compliance checks, risk analysis, and best practices, even when the user does not explicitly mention Fantasy.
Install
npx vskill@latest install qq362946/fantasy/fantasy-netSKILL.md
Fantasy-net
Fantasy is a high-performance C# distributed game server framework based on ECS architecture, using FTask for async operations.
Core Principles
Fantasy Technical Specifications
- Use
FTaskfor all async operations, notTask - Separate Entity data from logic (Handler/System); multi-assembly projects must separate to support hot reload
- Name Component business extension classes
{ComponentFullName}System; add a static{Domain}Helperonly when other systems need a shared business entry point - All registration is done at compile-time by source generators; don't manually register, don't modify
.g.cs - Entities, components, and Handlers use
sealed class; all classes except structs must be created via Entity - Use file-scoped namespaces (
namespace Fantasy;) - Use
Log.Debug/Info/Error()for logging; return error codes viaresponse.ErrorCode; business logic should not throw exceptions - Use Event system for module decoupling: publish events instead of direct calls; prefer Struct events (zero GC), use Entity events for complex logic; use EventSystem for sync, AsyncEventSystem for async
- Name Event listeners
{EventName}_{BusinessAction}, such asOnHpChange_ExitGame; never suffix them withSystem,Async, orHandler - When Control Center is enabled, use
ServiceDiscoveryfor dynamic Root Scene and SubScene routing; keep strict account-to-node affinity in business storage rather than the service registry - Before planned Scene shutdown, call
ServiceDiscovery.SetSceneOfflineAsync, reject new business allocations, wait one discovery cache cycle, then drain and close the Scene - Strictly follow SOLID principles
Development Behavioral Guidelines
Tradeoff: These guidelines bias toward caution over speed. For trivial tasks, use judgment.
See references/guidelines-examples.md for detailed Fantasy scenario examples.
1. Think Before Coding
Don't assume. Don't hide confusion. Surface tradeoffs.
Before implementing:
- State your assumptions explicitly. If uncertain, ask.
- If multiple interpretations exist, present them - don't pick silently.
- If a simpler approach exists, say so. Push back when warranted.
- If something is unclear, stop. Name what's confusing. Ask.
Fantasy Key Points: Before implementing, clarify: architecture pattern (single-server/distributed), Entity ownership (which Scene), communication method (Roaming/Address/SphereEvent), configuration source (local Fantasy.config or Control Center), and whether dynamic discovery or strict persistent affinity is required. When uncertain, ask; don't assume.
2. Simplicity First
Minimum code that solves the problem. Nothing speculative.
- No features beyond what was asked.
- No abstractions for single-use code.
- No "flexibility" or "configurability" that wasn't requested.
- No error handling for impossible scenarios.
- If you write 200 lines and it could be 50, rewrite it.
Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
Fantasy Key Points: Avoid premature abstraction of Entity/Component structures; don't design factory/strategy patterns for single scenarios. When users only need basic functionality, write Component + necessary AwakeSystem directly; refactor when extension is needed.
3. Surgical Changes
Touch only what you must. Clean up only your own mess.
When editing existing code:
- Don't "improve" adjacent code, comments, or formatting.
- Don't refactor things that aren't broken.
- Match existing style, even if you'd do it differently.
- If you notice unrelated dead code, mention it - don't delete it.
When your changes create orphans:
- Remove imports/variables/functions that YOUR changes made unused.
- Don't remove pre-existing dead code unless asked.
The test: Every changed line should trace directly to the user's request.
Fantasy Key Points: Never modify .g.cs generated files (if you find issues, modify source files and regenerate). Don't manually adjust source generator registration code. Don't "optimize" existing Entity/Component structures unless user explicitly requests refactoring.
4. Goal-Driven Execution
Define success criteria. Loop until verified.
Transform tasks into verifiable goals:
- "Add validation" → "Write tests for invalid inputs, then make them pass"
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
- "Refactor X" → "Ensure tests pass before and after"
For multi-step tasks, state a brief plan:
Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
Fantasy Key Points: Define verifiable steps and criteria: protocol export (dotnet fantasy-export successfully generates .g.cs), compilation passes (dotnet build with no errors), Handler registration (check generated registration code), message flow (Log.Debug outputs key nodes, confirm request/response correctness).
Reference File Navigation
Read the corresponding file based on the requirement; for complex tasks, read multiple files.
| File | When to Use | |
|---|---|---|
references/ecs/index.md | ECS entry: routes to Scene / SubScene / Entity definition / component operations / object pool / lifecycle; shared by server and Unity; read this first when Entity definition, component management, or ECS mechanism selection is involved | |
references/review.md | Fantasy code review entry: routes checks by ECS / Event / Timer / Protocol / Roaming / SphereEvent / HTTP / Database / Config; read this first when user wants review, code check, or Fantasy compliance verification | |
references/guidelines-examples.md | Development behavioral guidelines Fantasy scenario examples: Think Before Coding (clarify assumptions), Simplicity First (avoid over-engineering), Surgical Changes (precise modifications), Goal-Driven Execution (verifiable goals) with detailed comparison cases; read when understanding guideline application in Fantasy, or when code review reveals guideline violations | |
references/ecs/scene.md | Scene is the container and lifecycle boundary for all Entity/Component: cascade destruction when Scene disposes, OnCreateScene event, access system components via self.Scene (TimerComponent/EventComponent/NetworkMessagingComponent etc.); read when Scene concept, Scene initialization, OnCreateScene event, or Entity ownership is involved | |
references/ecs/ecs-check.md | ECS review checklist: Entity / Component / System / Scene / object pool / lifecycle common issues; read when user wants to check ECS code for Fantasy compliance | |
references/ecs/entity-definition.md | Entity / Component definitions: fields, ComponentSystem naming, optional cross-system Helper, and lifecycle System selection; read when creating Entity / Component types | |
references/timer/index.md | Timer entry: routes to async wait / callback timers / event integration / best practices; read first when user needs delayed execution, repeated tasks, countdown, Wait, OnceTimer, RepeatedTimer | |
references/timer/implement.md | Timer implementation: FTask.Wait, WaitTill, WaitFrame, OnceTimer, RepeatedTimer, cancel timers; read only when directly writing Timer code | |
references/timer/event.md | Timer and Event integration: event-based timers, hot reload differences, when to use events instead of Action; read only when hot-reload-friendly Timer logic is needed | |
references/timer/best-practices.md | Timer best practices and troubleshooting: performance tips, common errors, Scene destruction, precision, cancel strategies; read only when optimizing or troubleshooting Timer code | |
references/ecs/subscene.md | SubScene dynamic child scenes: lightweight isolated spaces created at runtime from parent Scene, sharing parent Scene core components but with independent entity lists; Scene.CreateSubScene() callback and registration order, Control Center discovery by parent Address, Address messaging, and active offline on Close(); read when needing instances, match rooms, instanced maps, dynamic battlefields, player private spaces, or on-demand scene creation/destruction | |
references/ecs/lifecycle.md | ECS lifecycle Systems: AwakeSystem, UpdateSystem, DestroySystem, DeserializeSystem, TransferOutSystem/TransferInSystem (cross-server transfer only) and trigger order; read when responding to Entity lifecycle events | |
references/event/index.md | Event entry: determine whether to use EventAwaiter or Event, then follow Workflow to corresponding doc; read first when requirement involves "wait for result" or "publish event" mechanism selection | |
references/event/event-awaiter.md | EventAwaiter entry: routes to implementation / modeling / troubleshooting; read first when user needs to wait for a condition, wait for player action, do request-response async flow, or explicitly mentions EventAwaiter/EventAwaiterComponent | |
references/event/struct-event.md | Struct event full workflow: Step 1 define event → Step 2 create listener → Step 3 publish event; recommended for most scenarios, read when creating Struct events | |
references/event/entity-event.md | Entity event full workflow: Step 1 create listener → Step 2 publish existing Entity (note isDisposed param); read only when passing existing Entity | |
references/event/check-event.md | Event system code review: Struct event checklist, Entity event checklist, listener naming, common error comparisons; read when checking existing event code | |
references/server/setup-server.md | Create new Fantasy server project, integrate Fantasy into existing project (.NET/NuGet), three-layer structure setup, logging system quick config | |
references/server/entry-initialize-hook.md | Entry initialization hook: inject custom startup logic via IEntryInitializeHook after config loading but before serializer init; read when user needs pre-startup validation, additional config loading, environment-specific setup, or wants to execute logic before any Scene is created | |
references/server/entry-initialize-hook-check.md | Entry initialization hook review checklist: interface implementation, timing understanding, responsibility boundary, exception handling, Hook independence; read when user wants to check IEntryInitializeHook code | |
references/server/kubernetes.md | Kubernetes deployment: StatefulSet Pod DNS, Headless Service, innerBindIP / outerBindIP, TCP/KCP protocol mapping, multi-replica and Control Center constraints; read first when Kubernetes, K8s, Pod, Service, container DNS, or cluster deployment is involved | |
references/unity/index.md | Unity client entry: routes to installation, connection, Session, receiving pushes; read first when Fantasy Unity client is involved | |
references/unity/unity-check.md | Unity review checklist: version consistency, compile macros, connection methods, Session usage, push Handler common issues; read when user wants to check Unity client code | |
references/unity/setup-unity.md | Unity client install Fantasy.Unity, configure compile symbols, import protocols; read only during installation or initial integration | |
references/unity/unity-connection.md | Unity client connect to server: FantasyRuntime component, scene.Connect, Runtime.Connect, protocol selection; read only during connection initialization | |
references/unity/unity-session.md | Unity client Session usage: send messages, RPC, connection holding, disconnect; read only for how to send messages after connection | |
references/logging.md | Logging system details: Fantasy.NLog setup, appId and per-Scene files, Develop/Release flush behavior, NLog.config, custom ILog implementation (Serilog etc.) | |
references/logging-check.md | Logging review c |
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingSkills/fantasy-net/SKILL.md
Popularity
- Repository stars
- 1,297
- Repository forks
- 201
- 7-day trend score
- 36
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/qq362946/fantasy/fantasy-net)