XGame
一套适用于大型团队的Unity游戏解决方案。
Install / Use
/learn @XGameSolutions/XGameREADME
XGame
XGame旨在提供一套完整的大型游戏开发解决方案,包括前后端、底层驱动、配置数据等。采用C++、C#、Lua、Python等语言开发。
XGame模拟大项目团队管理流程,为了方便项目管理、多部门协作、权限划分、避免版本管理错乱等,将工程拆分成多个仓库。不同的开发角色可以迁出不同的仓库组合所需的最小工程,提高开发效率,减少冗余错误,降低维护成本。
XGame对人数百人以上,资源量30G以上的团队具有一定的参考意义。小团队小游戏的话可以考虑更简洁的方案。
本方案重点放在整体框架设计和资源管理上,有些功能只是简单实现,特别是底层驱动和服务器部分,没有具体参考意义。
方案组成
| 仓库 | 描述 | | ------------------------------------------------------------------------------------------------- | -- | | XGame-XClientLua | XGame游戏解决方案:客户端Lua代码 | | XGame-XConfig | XGame游戏解决方案:配置数据 | | XGame-XCommon | XGame游戏解决方案:前后端共用的Lua代码 | | XGame-XDriver | XGame游戏解决方案:底层C++驱动代码,前后端共用 | | XGame-XServer | XGame游戏解决方案:服务端Lua代码 | | XGame-XClient-Packages | XGame游戏解决方案:Unity客户端的Packages目录 | | XGame-XClient-ProjectSettings | XGame游戏解决方案:Unity客户端的ProjectSettings目录 | | XGame-XClient-iOS | XGame游戏解决方案:Unity客户端的ResAB下的iOS目录 | | XGame-XClient-Editors | XGame游戏解决方案:Unity客户端的Assets下的Editors目录,用于放工具类或不用打包的代码 | | XGame-XClient-Plugins | XGame游戏解决方案:Unity客户端的Assets下的Plugins目录,用于放第三方插件代码 | | XGame-XClient-ResData | XGame游戏解决方案:Unity客户端的Assets下的ResData目录,用于放程序和策划资源数据 | | XGame-XClient-ResPublic | XGame游戏解决方案:Unity客户端的Assets下的ResPublic目录,公共资源 | | XGame-XClient-ResEffect | XGame游戏解决方案:Unity客户端的Assets下的ResEffect目录,特效资源 | | XGame-XClient-ResModel | XGame游戏解决方案:Unity客户端的Assets下的ResModel目录,角色模型资源 | | XGame-XClient-ResScene | XGame游戏解决方案:Unity客户端的Assets下的ResScene目录,场景资源 | | XGame-XClient-ResSceneModel | XGame游戏解决方案:Unity客户端的Assets下的ResSceneModel目录,场景模型资源 | | XGame-XClient-ResUI | XGame游戏解决方案:Unity客户端的Assets下的ResUI目录,UI资源 | | XGame-XClient-Runtime | XGame游戏解决方案:Unity客户端的Assets下的Runtime目录,运行时或打包用的代码 |
迁出参考
√√ 表示需要迁出仓库,可以提交仓库
√x 表示需要迁出仓库,不能提交仓库
| 仓库 | 打包 | 程序 | 程序 | 策划 | QA | QA | 美术 | 角色 | 场编 | 场模 | 特效 | UI | | ----------------------------- | - | - | - | - | - | - | - | - | - | - | - | - | | XGame-XClientLua | √√ | √√ | √√ | √x | √x | | XGame-XConfig | √√ | √x | √x | √√ | √x | | XGame-XCommon | √√ | √√ | √√ | √x | √x | | XGame-XDriver | | √√ | | XGame-XServer | | √√ | √√ | √x | √x | | XGame-XClient-Packages | √√ | √√ | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-ProjectSettings | √√ | √√ | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-ResAB | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-Editors | | √√ | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-Plugins | √√ | √√ | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-Runtime | √√ | √√ | √√ | √x | √x | √x | √x | √x | √x | √x | √x | √x | | XGame-XClient-ResData | √√ | √√ | | √√ | √x | | √x | √x | √x | √x | √x | √x | | XGame-XClient-ResEffect | √√ | √√ | | √√ | √x | | √√ | | | | √√ | | | XGame-XClient-ResModel | √√ | √√ | | √√ | √x | | √√ | √√ | | | | | | XGame-XClient-ResScene | √√ | √√ | | √√ | √x | | √√ | | √√ | √x | | | | XGame-XClient-ResSceneModel | √√ | √√ | | √√ | √x | | √√ | | √x | √√ | | | | XGame-XClient-ResUI | √√ | √√ | √√ | √x | √x | | √√ | | | | | √√ | | XGame-XClient-ResPublic | √√ | √√ | √√ | √√ | √x | | √√ | √√ | √√ | √√ | √√ | √√ |
参考方案
- 打包方案
- 首包分包方案
- 多语言包方案
- 多工程多版本的资源同步方案
- 自动化首包资源抽取方案
主要功能
| 功能 | 完成情况 |
| ----------------------------------- | ----- |
| C++和Lua交互方案 | 已完成 |
| XLua | 已完成 |
| 基于RecastNavigation的导航网格寻路 | 已完成 |
| 基于Libuv的网络通信 | 已完成 |
| 自动化打包 | 开发中 |
| AB浏览和管理工具 | 开发中 |
| Editor-Phone远程调试工具 | 开发中 |
| Shader和变体管理工具 | 开发中 |
| 资源加载和管理 | 待开发 |
| Patch和热更 | 待开发 |
| LuaBT行为树AI方案 | 待开发 |
| 数据库存储和读写方案 | 待开发 |
| 日志输出和收集 | 待开发 |
| SFM影子跟随移动 | 待开发 |
| 战斗同步 | 待开发 |
开发环境
- MacOS 10.15.6
- Unity2019.4.39f1
使用教程
- 将本仓库
clone或下载到本地,放到一个新目录,如XGameSolutions下。 - 运行
XGame里面的project_pull_clone_developer.bat或project_pull_clone_developer.sh脚本Clone工程,如果工程已Clone则进行更新。 - 用
Unity打开XUnity下的UnityForCoder工程即可运行。
目录结构
.
├── XGameSolutions
. ├── XClientLua
├── XConfig
├── XDriver
├── XGame
├── XCommon
├── XServer
└── XUnity
├── UnityForCoder
| ├── Assets
| | ├── Editors
| | ├── Plugins
| | ├── ResEffect
| | ├── ResModel
| | ├── ResScene
| | ├── ResSceneModel
| | ├── ResUI
| | ├── ResPublic
| | └── Runtime
| ├── Packages
| ├── ProjectSettings
| └── ResAB
├── UnityForArt
打包方案
规则
- 需要手动设置ABName的资源:要用的.unity场景文件,要用的模型prefab,要用的特效prefab。其他的资源不要手动设置ABName,脚本会自动分析依赖设置。
- AB加前缀,方便分类查看,如 model_prefabname, scene_scenename, scene_dep_texturename。
- 自动分析的依赖AB加明显标志,方便每次重新分析设置时清理,如:dep。
- AB的名字只能由小写字母、数字和下划线组成,不能包含其他特殊字符,统一将
[^a-zA-Z0-9]替换为_。 - 清理依赖AB时,有时候Unity里看不到ABName了但meta文件里还存在,可以通过读取meta文件清除ABName。
- 所有Lua代码都打到一个同一个AB里。
- 所有配置表都打到同一个AB里。
- 【UI】UI按目录自动设置AB,同一个系统的UI可都打到同一个AB里。
- 【UI】大图单独打包,一张大图一个AB。
- 【UI】贴图和预设分离打包,减少热更量和避免循环依赖。
- 【Shader】Shader单独打包,方便热更,避免打包冗余。
- 【Shader】Shader变体手动维护。
- 【Shader】代码要用的Shader统一放到同一个AB,自定义Shader加载,不能直接用Shader.Find。
- 【Shader】非代码用的shader不要手动设ABName,通过依赖分析自动设置,避免把不再使用的Shader打进包里。
- 【模型】只需给要用的prefab手动设置ABName,其他资源的ABName由依赖分析自动设置。
- 【模型】模型中用到的材质球和它用到的贴图单独打包。
- 【模型】如果贴图被多个材质球共用,贴图抽离出来单独打包。如果贴图很小(如小于50KB),可统一打到一个公共的模型贴图包里。
- 【场景】只需给要用的.unity场景手动设置ABName,其他资源的ABName由依赖分析自动设置。
- 【场景】场景中用到的材质球和它用到的贴图单独打包。
- 【场景】如果贴图被多个材质球共用,贴图抽离出来单独打包。如果贴图很小(如小于50KB),可统一打到一个公共的场景贴图包里。
- 【场景】场景中用到的prefab和它引用到的资源单独打包(shader除外,已设ABName的资源除外)。
依赖设置ABName流程
- 清空meta文件里的依赖ABName。
- 获取所有ABName的依赖资源。
- 清空依赖资源的ABName。
- 有些目录强设ABName。
- 模型的材质球单独设置ABName。
- 场景的材质球单独设置ABName。
- 场景的Prefab单独设置ABName。
- 其他依赖资源设置ABname。
- Shader引用的资源打包到对应的Shader里。
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
