XGame Save

一套适用于大型团队的Unity游戏解决方案。

Project README

XGame

XGame旨在提供一套完整的大型游戏开发解决方案,包括前后端、底层驱动、配置数据等。采用C++C#LuaPython等语言开发。

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

使用教程

  1. 将本仓库clone或下载到本地,放到一个新目录,如XGameSolutions下。
  2. 运行XGame里面的project_pull_clone_developer.batproject_pull_clone_developer.sh脚本Clone工程,如果工程已Clone则进行更新。
  3. 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流程

  1. 清空meta文件里的依赖ABName。
  2. 获取所有ABName的依赖资源。
  3. 清空依赖资源的ABName。
  4. 有些目录强设ABName。
  5. 模型的材质球单独设置ABName。
  6. 场景的材质球单独设置ABName。
  7. 场景的Prefab单独设置ABName。
  8. 其他依赖资源设置ABname。
  9. Shader引用的资源打包到对应的Shader里。
Open Source Agenda is not affiliated with "XGame" Project. README Source: XGameSolutions/XGame
Stars
66
Open Issues
0
Last Commit
1 year ago

Open Source Agenda Badge

Open Source Agenda Rating