# GameDesigner **Repository Path**: xxmfl/GameDesigner ## Basic Information - **Project Name**: GameDesigner - **Description**: Verxel(原GDNet)双端Rpc网络框架用于Unity3D,窗体程序和控制台项目开发, 高效稳定, 高性能高并发, 各种协议一键切换: gcp, udx, kcp, tcp, web, http 包含各种模块, AOI模块, Recast寻路模块, GameCore客户端框架等等 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 165 - **Created**: 2026-06-20 - **Last Updated**: 2026-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GameDesigner - 游戏开发框架
![Unity](https://img.shields.io/badge/Unity-2021.3+-black?style=for-the-badge&logo=unity) ![C#](https://img.shields.io/badge/C%23-9.0+-blue?style=for-the-badge&logo=c-sharp) ![.NET](https://img.shields.io/badge/.NET-8.0-512BD4?style=for-the-badge&logo=dotnet) ![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge) **专为游戏设计的前后端网络框架与可视化状态机**
--- ## 项目简介 GameDesigner 是一个面向 Unity 引擎的游戏开发框架,核心提供**前后端网络通信**和**可视化动作状态机**两大能力。框架采用模块化设计,各模块可独立使用也可组合部署,同时提供 .NET Framework 4.8(Unity 端)和 .NET 8.0(独立服务器端)双构建目标。 **作者**: 冷月 | **协议**: MIT --- ## 架构概览 ``` GameDesigner/ ├── Core/ # 基础层:序列化、RPC、SyncVar、线程安全容器、软浮点 ├── Network/ # 网络层:Client/Server、多传输协议、适配器模式 ├── StateMachine~/ # 可视化状态机:图表编辑器、行为组件、动画集成 ├── ActorSystem~/ # 角色系统:Actor/Skill/Buff/Property ├── Entities~/ # ECS 架构:Entity/Component/World ├── AOI~/ # 兴趣区域:九宫格空间分区 ├── MVC~/ # MVC 框架:ViewBind 可视化绑定 ├── NetworkComponent~/ # Unity 网络组件:NetworkObject/Transform/Animator ├── GameCore~/ # 游戏基础设施:UI/资源/场景/音频/事件/对象池 ├── NonLockStep~/ # 非锁步同步:确定性物理、回滚、BEPUphysics ├── Distributed~/ # 分布式:一致性哈希、负载均衡、唯一ID ├── Recast~/ # 寻路:Recast/Detour 封装 ├── Table/ # 配置表:Excel→代码、JSON/二进制序列化 ├── Serialize/ # JSON 序列化(内嵌 Newtonsoft.Json) ├── Helper/ # 工具集:加密、压缩、MySQL、代码生成 ├── Extensions/ # 扩展方法:Client/Server/Unity/UniTask ├── Editor/ # 编辑器工具:模块导入、序列化构建、属性绘制 ├── UniTask/ # 零分配 async/await(内嵌) ├── K4os.Hash.xxHash/ # xxHash32/64 快速哈希(内嵌) ├── SoftFloat/ # 软浮点 sfloat/bigfloat(确定性跨平台) └── Example~/ # 示例项目 ``` --- ## 模块详解 ### 1. Core - 核心基础层 框架的底层基础设施,所有其他模块都依赖于此。 **主要功能:** - **二进制序列化** (`BinarySerialize`): 高性能二进制序列化器,支持 IL2CPP 友好模式,可用于网络传输和本地存储 - **RPC 系统** (`Net.Share`): 基于 `[Rpc]` 特性的远程过程调用,支持多种路由模式(EntityRpc、Scene、Notice、Local 等) - **SyncVariable 同步变量**: `SyncVariable` 泛型同步包装器,通过脏标记自动检测变更并同步,支持 `OnValueChanged` 回调 - **线程安全容器** (`Net.System`): 提供 `FastList`、`HashSetEx`、`QueueSafe`、`Segment` 等高性能线程安全数据结构 - **缓冲池** (`BufferPool`/`Segment`): 字节缓冲池与分片管理,减少 GC 压力 - **定时器系统** (`TimerManager`/`TimerSchedule`): 高精度定时器调度 - **软浮点** (`SoftFloat`): `sfloat` (IEEE 754 binary32) 和 `bigfloat` 的纯软件实现,保证跨平台确定性 **使用示例:** ```csharp using Net.Share; public class PlayerData { // SyncVariable 泛型同步变量,值变更自动标记脏并触发回调 public SyncVariable Health = new SyncVariable(100, OnHealthChanged); public SyncVariable Speed = new SyncVariable(5f); public SyncVariable Name = new SyncVariable("Player"); private static void OnHealthChanged(int newValue) { Debug.Log($"血量变化: {newValue}"); } // Rpc 特性标记远程方法,支持字节码/哈希/字符串三种路由标识 [Rpc(100)] public void Attack(int targetId, float damage) { // 该函数可被远程调用 } } ``` --- ### 2. Network - 网络通信层 完整的前后端网络通信框架,支持多种传输协议和灵活的可插拔架构。 **主要功能:** - **服务端** (`Net.Server.ServerBase`): 抽象服务器基类,通过 `ISerializeAdapter`、`IPackageAdapter`、`IRpcAdapter`、`IRpcModelFactory` 四组适配器接口实现完全可定制的网络栈 - **客户端** (`Net.Client.Client`): 抽象客户端基类,提供 `OnConnected`、`OnConnectFailed`、`OnReconnect`、`OnDisconnect` 等完整的事件体系,内置断线重连和排队机制 - **客户端对等体** (`Net.Server.ClientPeer`): 服务端持有的玩家连接对象,继承 `ClientUnitBase`,管理单连接的收发、心跳和线程分配 - **场景管理** (`Net.Server.SceneBase`): 服务端场景/房间,容纳玩家集合,支持帧同步操作分发和线程组迁移 - **多传输协议**: 内置 Gcp / Kcp / Udx / WebSocket 四种传输层实现,位于 `Network/Gcp~/`、`Network/Kcp~/`、`Network/Udx~/`、`Network/Web~/` - **网络命令** (`Net.Share.NetCmd`): 定义全部内置协议命令码(心跳、RPC、同步、排队等),用户自定义命令从 100 开始 - **流量统计** (`NetworkTrafficStatistics`): 实时收发字节数和数据包统计 **使用示例:** ```csharp using Net.Server; using Net.Client; using Net.Share; // --- 定义 RPC 方法 --- public class GameRpc { [Rpc(100)] public void PlayerMove(long playerId, float x, float y, float z) { } [Rpc(101)] public void PlayerAttack(long playerId, int skillId) { } } // --- 服务端 --- public class GameServer : ServerBase { protected override void OnStart() { // 可替换适配器 SerializeAdapter = new BinarySerializeAdapter(); PackageAdapter = new PackageAdapter(); RpcAdapter = new NormalRpcAdapter { Mode = AdapterMode.Server }; } protected override void OnClientConnected(ClientPeer client) { Debug.Log($"玩家连接: {client.UserId}"); } } // --- 客户端 --- public class GameClient : Client { public GameClient() { OnConnected += () => Debug.Log("连接成功"); OnConnectFailed += () => Debug.Log("连接失败"); OnReconnect += () => Debug.Log("重连成功"); OnDisconnect += () => Debug.Log("断开连接"); } } ``` --- ### 3. StateMachine - 可视化状态机 Unity 编辑器内完整的可视化状态机系统,支持动画状态机、子状态机、行为组件等。 **主要功能:** - **可视化编辑器** (`StateMachineWindow`/`GraphEditor`): 在 Unity Editor 中拖拽创建状态节点和连线 - **状态** (`GameDesigner.State`): 密封类,包含 `transitions` 过渡数组、`behaviours` 行为数组、`actionSystem` 动作系统开关 - **过渡** (`GameDesigner.Transition`): 状态之间的连线,支持 `exitTime` 定时过渡和 `ScriptControl` 脚本控制模式 - **行为组件** (`BehaviourBase`): 类似 Unity Component 的附加机制,`State.AddComponent()` 动态添加行为 - **动画模式** (`AnimationMode`): 支持 Animation / Animator / MeshAnimator / Timeline / Time / None 六种模式 - **播放模式** (`AnimPlayMode`): Random(随机)、Sequence(顺序)、Code(代码控制) - **状态层** (`IStateLayer`): 多层状态机支持 - **状态类型** (`StateType`): None / SubStateMachine / Parent,支持嵌套子状态机 - **软浮点支持**: 定义 `ENABLE_SFLOAT` 后过渡时间使用 `sfloat` 保证确定性 **使用示例:** ```csharp using GameDesigner; public class PlayerStateMachine : StateMachineView { private void Start() { // 获取状态机控制器 var sm = Controller.GetStateMachine(0); // 获取默认状态的过渡,添加脚本控制行为 var defaultState = sm.DefaultState; defaultState.AddComponent(); // 通过代码切换状态 sm.PerformTransition(sm.CurrState.transitions[0]); } } // 自定义行为组件 public class OnStartBehaviour : BehaviourBase { public override void OnEnter() { Debug.Log($"进入状态: {State.Name}"); } public override void OnUpdate() { // 每帧更新逻辑 } public override void OnExit() { Debug.Log($"离开状态: {State.Name}"); } } ``` --- ### 4. ActorSystem - 角色系统 面向 RPG 类型游戏的角色管理框架,定义 Actor / Skill / Buff / Property 四层抽象。 **主要功能:** - **角色基类** (`ActorSystem.ActorBase`): 继承 `Net.Entities.Component`,可融入 ECS 架构,持有 `Commands` 字典路由操作指令,实现 `IGridObject` 接口与 AOI 系统联动 - **泛型角色** (`ActorBase`): 携带属性/技能/Buff 的完整角色,自动遍历更新技能冷却和 Buff 生命周期 - **技能** (`ActorSystem.SkillBase`): 管理冷却时间 (`CooldownTime`/`CurrentCooldownTime`),`UseSkill()` 检查冷却并触发 `OnUseSkill()` 虚方法 - **Buff** (`ActorSystem.BuffBase`): 生命周期回调 `OnStart()` → `OnUpdate()` → `OnEnd()`,`OnTrigger()` 用于 DOT 类效果的克隆触发 - **属性** (`ActorSystem.PropertyBase`): 最小化基类,提供 `IsDeath` 判定,由用户扩展具体属性 **使用示例:** ```csharp using ActorSystem; // 自定义属性 public class HeroProperty : PropertyBase { public int Health = 100; public int MaxHealth = 100; public int Mana = 50; public int Attack = 10; public override bool IsDeath => Health <= 0; } // 自定义技能 public class FireballSkill : SkillBase { public override void OnUseSkill() { // Self 是泛型约束提供的当前角色引用 Self.Property.Mana -= 10; Debug.Log("释放火球术"); } } // 自定义 Buff public class PoisonBuff : BuffBase { private float tickTimer; public override void OnStart() { Debug.Log($"{Target.Name} 中毒"); } public override bool OnUpdate() { tickTimer += Time.deltaTime; if (tickTimer >= 1f) { tickTimer = 0f; Target.Property.Health -= 5; } return true; // 返回 true 持续生效 } public override void OnEnd() { Debug.Log($"{Target.Name} 中毒效果结束"); } } // 自定义角色 public class Hero : ActorBase { public override void UseSkill(int index) { if (index < Skills.Count) Skills[index].UseSkill(); } } ``` --- ### 5. Entities - ECS 实体组件系统 不依赖 Unity 的纯 C# ECS 架构,可用于服务端逻辑。 **主要功能:** - **世界** (`Net.Entities.World`): 实体容器,通过 `Init()` 自动扫描 `[RuntimeInitializeOnLoadMethod]` 特性完成初始化,管理根实体和定时事件 - **实体** (`Net.Entities.Entity`): 密封类,API 设计模仿 `GameObject`(`gameObject` 属性指向自身、`active` 激活开关),支持父子层级 (`Parent`/`Childs`),组件通过 `FastList` 存储 - **组件** (`Net.Entities.Component`): 基类,持有 `Entity` 反向引用,提供 `GetComponent()`/`GetComponentInChildren()` 等 Unity 风格查询方法 **使用示例:** ```csharp using Net.Entities; public class MyWorld : World { public override void OnInit(params object[] args) { var entity = new Entity { active = true }; AddEntity(entity); var comp = entity.AddComponent(); } } public class MyComponent : Component { public void DoSomething() { // 通过 Entity 访问同实体上的其他组件 var other = GetComponent(); } } ``` --- ### 6. AOI - 兴趣区域 九宫格空间分区系统,用于优化大型多人在线场景的网络同步。 **主要功能:** - **网格世界** (`Net.AOI.GridWorld`): 将世界划分为矩形网格,`GridType.Horizontal`(3D 游戏)/ `GridType.Vertical`(2D 游戏) - **网格** (`Grid`): 单个网格单元,持有其中的对象列表 - **Unity 组件** (`Net.Component.AOIObject`): MonoBehaviour,`Start()` 自动注册到 `AOIManager.I.world`,支持 `OnMainRoleEnter`/`OnMainRoleExit` UnityEvent - **接口** (`IGridObject`): `Identity`、`Position`、`Grid`、`MainRole`,由 `ActorBase` 和 `AOIObject` 实现 - **回调**: `OnEnter(IGridObject)` / `OnExit(IGridObject)` / `OnEnterGrid(Grid)` / `OnLeaveGrid(Grid)` **使用示例:** ```csharp using Net.AOI; using Net.Component; using UnityEngine; public class GameAOISetup : MonoBehaviour { public int gridWidth = 10; public int gridHeight = 10; public Vector2 worldSize = new Vector2(1000, 1000); private void Awake() { // 初始化九宫格世界 var world = new GridWorld(); world.Init(Vector2.zero, new Vector2(gridWidth, gridHeight), worldSize); AOIManager.I.world = world; } } // 挂载 AOIObject 组件的 GameObject 会自动注册到网格系统 // 实现 IGridObject 的自定义对象 public class Monster : ActorBase { public override void OnEnter(IGridObject gridObject) { if (gridObject.MainRole) { // 玩家进入视野,开始同步该怪物 Debug.Log("玩家进入视野,激活怪物"); } } public override void OnExit(IGridObject gridObject) { if (gridObject.MainRole) { // 玩家离开视野,停止同步 Debug.Log("玩家离开视野,休眠怪物"); } } } ``` --- ### 7. MVC - 模型视图控制器 Unity 编辑器可视化数据绑定框架。 **主要功能:** - **ViewBind** (`MVC.ViewBind`): MonoBehaviour,包含 `List` 列表,每个 Field 将字符串名称关联到 Unity Object 引用,支持运行时 `To()` 类型转换获取 - **可视化编辑器** (`ViewBindEditor`): Inspector 面板中拖拽绑定 UI 控件到字段 - **AppContext**: 应用上下文,协调 Model/View/Controller **使用示例:** ```csharp using MVC; using UnityEngine; using UnityEngine.UI; public class LoginView : ViewBind { private void Start() { // 通过名称获取绑定的 UI 控件 var usernameInput = fields.Find(f => f.name == "UsernameInput").To(); var passwordInput = fields.Find(f => f.name == "PasswordInput").To(); var loginBtn = fields.Find(f => f.name == "LoginBtn").To