减少前: 登录(游戏公告)610MB/205个AB;打怪:816MB/393个AB 减少后: 登录(游戏公告)100MB/136个AB;打怪:457MB/346个AB 具体改动: - 不打包mat.unity3d,避免依赖爆炸。 - 提前打UI与effect AB,减少他们对别的AB的依赖。
RO项目说明
目录结构说明
常规目录
| 路径 | 说明 |
|---|---|
| Assets | 游戏主体资源 |
| BMFont | 位图字体工具 (已废弃) |
| Build | 编译目标版本使用到的资源路径 |
| Library | Unity工具自身的存放的数据路径 |
| Packages | Unity第三方库引用描述文件 |
| ProjectSettings | Unity项目的设置存放路径 |
| ProtocolGen | google protobuf 转lua 的工具 |
| .gitignore | git忽略设置文件 |
临时目录
| 路径 | 说明 |
|---|---|
| assetbundle | ab输出的临时路径 |
| assetbundleBak | ab输出的缓存路径 |
| Logs | Packages工具日志路径 |
| obj | C#编译的临时路径 |
| Temp | Unity工具自身的存放的临时数据路径 |
Assets
| 路径 | 说明 |
|---|---|
| _Discard | 存放过期或将要过期的资源 |
| AppInfo | 编译时才使用的资源 (图标和闪屏) |
| ArtScript | 特效使用的脚本 |
| CinemachinePostProcessingV2 | 镜头控制插件 |
| Content | 游戏中使用到的美术资源(基本上所有的美术资* 都在里面,除场景资源) |
| Editor | 自定义的编辑工具 |
| Flux | 技能编辑器引用的插件 |
| Gizmos | |
| Lua | 游戏的lua代码 |
| LuaProfilerClient | lua性能分析器 |
| LuaTools | csv转lua配置工具 |
| MeshBaker | Mesh合并工具 |
| Plugins | 插件目录 |
| Resources | 由于游戏都走AB加载,基本不再有什么资源放入 |
| Scenes | 所有的场景和相关资源 |
| Shaders | 游戏中自定义的Shader |
| Src | 游戏的C#代码 |
| T4M | T4M工具 |
| T4MOBJ | |
| TextMesh Pro | TextMesh默认资源 |
| ToLua | tolua相关代码 |
| game.unity | 游戏启动场景 |
| relogin.unity | 游戏进入重登时的场景 |
| *.unity | 剩下的一些测试场景(只和编辑有关,和运行无关) |
Assets/Content
| 目录 | 说明 |
|---|---|
| Audio | 音频资源 |
| Config | csv配置表,C#中使用的配置表 |
| Fonts | 字体文件 |
| Icons | 游戏中的Icon,策划配置,程序加载显示 |
| Lua | 编译时,lua临时缓存路径 因为.lua文件无法直接打ab包,转.txt |
| Materials | 通用材质球 |
| PosProfiles | PostProcess效果的配置 (目前只用于创角) |
| Prefabs | 所有程序直接使用的Prefab |
| Raw_Art | 美术的原始资源 (比如Prefab引用到的资源,程序不直接调用) |
| TimeLine | TimeLine配置 (游戏中暂未用上) |
| ToLua | 编译时,tolua临时缓存路径 因为.lua文件无法直接打ab包,转.txt |
| Xml | xml配置,C#中使用的配置(包含技能,场景出生点等配置) |
Unity项目中自定义工具说明
| 菜单项 | 说明 |
|---|---|
| Assets/CheckSceneDep | 检查场景依赖 |
| Assets/设置PackingTag | 手动设置图集合并Tag |
| Assets/OptModel | 优化模型 |
| Assets/SaveRTToPPNG | 把RenderTexture转PNG |
| Assets/FindImageReferences | 找出图片被谁引用 |
| Assets/FindMatReferences | 找出材质球被引用 |
| Assets/CheckFileName | 查看文件全名 |
| Assets/RO/清理Animator | 清理预制体上默认的Animator组件 |
| Assets/更新动画数据 | |
| Assets/ExportMesh | 导出成Mesh文件 |
| Assets/GenerateLuaClass | 对某个UI预制体生成标准化脚本 |
| SkillTool/Frame Event Panel/Open Editor | 技能编辑器 |
| SkillTool/启动训练营测试 | 测试技能(未再维护,功能缺失) |
| [快捷启动]/[启动游戏] | 快速启动游戏 |
| Lua/* | tolua工具(用于生成lua调用C#的绑定文件) |
| Cinemachine/* | Cinemachine工具 |
| RO_Tool/* | RO项目中特殊工具 |
| AssetBundle/* | 不再使用设定AssetsLabels来生成AB,已淘汰 |
| AssetBundle/打包工具 | 用于打包版本 |
| Tools/* | 包含一些小工具 |
C#部分代码说明
game.scene=>start: game.scene
Start=>operation: Start(GameMgr.cs)
是否启动=>condition: 是否启动
StartLaunch=>operation: StartLaunch(LaunchLoadMgr.cs)
Update=>operation: Update(GameMgr.cs)
EnterLuaLogin=>operation: EnterLuaLogin(GameMgr.cs)
是否退出游戏=>condition: 是否退出游戏
QuitGame=>end: QuitGame(GameMgr.cs)
game.scene->Start->是否启动
是否启动(yes)->StartLaunch->EnterLuaLogin->Update->是否退出游戏
是否启动(no)->Update->是否退出游戏
是否退出游戏(yes)->QuitGame
是否退出游戏(no)->Update
C#部分的主体逻辑如上流程
GameMgr.cs C#与lua层交互。c#层面战斗开始入口,销毁。 相关战斗功能函数:
- 重登、断线重连:ReLogin (负责:销毁战斗、清空战斗数据。)流程:停止战斗、通知lua层UI 、lua层处理完毕、调回C#层 清理数据
- 设置属性数据:SetTeamData(负责:同步战斗角色相关属性数据)流程:由lua层调用通知修改、分为强制同步,与延迟同步。强制同步:如果在战斗中会结束战斗同步属性属性、刷新加载相关技能、时装。延迟同步:设置为脏标记、下次战斗开始时同步相关属性、技能加载、时装等。
- 更新技能数据:UpdateTeamSkills(负责更新角色技能信息)流程:停止当前战斗、强制同步刷新技能或标记为脏标记下次战斗开始时同步刷新技能
- 战斗入口:PreloadBattle 、PreloadVersusBattle、PreloadBossBattle、PreloadTimeBattle(负责新的战斗开始)流程:停止当前战斗、设置当前战斗角色属性、创建新的战斗实例、启动战斗
- 战斗结束:ShutDownBattle(负责停止 当前战斗)包含是否销毁操作、用于断线时的操作、只停止战斗、后UI层处理完成后、在执行销毁操作
- 负责逻辑层打断正常停止战斗 ForceStopBattle(在战斗流程中,正常打断返回战斗结束、具体停止操作对应不同战斗实例的重载)
- 游戏速度:SetGameSpeed、SaveGameSpeed(设置游戏速度、以及设置保存游戏速度)
BattleSystemNew.cs c#层战斗管理、负责管理整场战斗 相关战斗功能函数:
- 相关战斗事件注册:Start (负责注册监听相关战斗事件、以及初始化)流程:现有初始化战斗飘字管理器、监听战斗事件、设置游戏速度
- 战斗总更新:Update (c#层面所有战斗更新) UpdateLogic更新战斗逻辑层(目前更新战斗实例逻辑)换算为帧时间更新 UpdateTrigger更新触发层(目前更新全局事件处理新手定制战斗) UpdateElse更新其他(目前战斗item掉落 表现) 3.最后更新:LateUpdate用于camera 表现更新
- 战斗统计:GetBattleStatistics、HasBattleStatistics (获取战斗统计、用于UI界面显示)
- 获取战斗剩余时间:GetLeftFightingTime (只在time模式的战斗有效)
- 开始战斗实例:StartBattle、StartVersusBattle、StartBossBattle、StartTimeBattle、StartNewbieBossBattle(设置战斗结束条件、创建战斗实例并且开启)
- 播放录像:ReplayTimeBattle(播放录像战斗、解析录像json、设置战斗结束条件、创建战斗实例且开始)
- 下一场战斗:EnterNextBattle (巡游战斗中开始下一场战斗)
- 获取出身点:GetFieldSummonPos (返回位置、角度)
- 暫停戰鬥:DoPauseFight (更具不同戰鬥实例,有不同实现。供外部调用)暂停会记录暂停标记、已有暂停标记会停止逻辑更新、战斗逻辑状态切换
- 给战斗添加战斗角色:AddActorToBossBattle(目前BOSS战斗用到、传递角色属性数据)对应BOSS战流程:如果战场不存在角色则创建战斗角色(通过角色管理添加角色) FighterMgr.AddFighter、同时异步加载角色f.Ctrl.AsyncLoad()、加载完成后放入战斗f.Spawn(初始化角色战斗属性、、)战斗落位EnterSeat、保存添加角色操作到录像
- 异步加载角色完成回调OnFighterAsyncLoaded(目前使用在AddActorToBossBattle添加中设置回调)
- 战斗角色操作:RemoveActorFromBossBattle、SetActorDead、SetActorDeadSyncBossLife(目前BOSS战斗实现)
- 竞技场战斗相关:SetVersusActors、BeginVersus、
- 解析角色参数实例化为角色属性:ParseTeamActors(根据ActorParam结构信息实例化角色属性)
- 销毁当前战斗:DisposeCurrentBattle(清空实例)销毁资源对象、战斗角色对象、预加载池、相机、声音
- 关闭当前战斗:ShutDownCurrentBattle(清空数据、参数代表是否销毁)1.停止战斗逻辑、引用置空、清空数据。2.如带有销毁标记调用销毁DisposeCurrentBattle
- 播放录像:Replay(该接口使用在巡游BOSS模式录像)流程:停止当前巡游战斗、开启录像战斗
- 清空战报:ClearBattleLog (清空本场战斗战斗日志)
- 停止战斗:ForceStopBattle (目前部分战斗中实现打断、巡游战斗、巡游BOSS战、爬塔战斗)
- 相机相关:SetBattleCamera、DisableBattleCamera、SetBossBattleCamera、SetFollowCamera、LookAtBattleFieldCenter、PerformStartCamera、EnterBossIntro、ExitBossIntro、ShowComingCamera、PlayComingCameraAnim、HideComingCamera、IsPlayingComingCamera、
- 场景相关:ActiveSceneAnim(参数传递对象名。动画名。是否激活)ActiveSceneGo(激活场景对象)
- UI相关:SetUINodeVis(设置激活UI节点、目前新手战斗中使用)、OnRefreshBattleOutput刷新UI战斗输入日志、RefreshStatistics 更新战报、RefreshMinimap刷新小地图
- 战斗正式开始:OnFightingStart(所有战斗准备完成后。正式开始战斗)流程:开启战斗UI、设置战斗速度、通知战斗UI层开始战斗
- 同步战斗角色属性数据SyncTeams(参数是否强制设置)标记为脏标记、战斗开始时会根据脏标记同步属性、或有强制标记为结束当前战斗、立刻同步属性、刷新时装、技能、角色模型等
- 技能更新脏标记相关: ClearSkillDirty、UpdateTeamSkills、 CheckSkill、ForceSyncSkill
- 职业技能脏标记相关:SetProfessionDirty、CheckProfession、
- 角色属性脏标记 :SetTeamData
- 战斗事件相关:OnChallengeBoss(开始挑战巡游BOSS)OnCloneNewBoss(拷贝boss角色实例)OnBossSpawned(boss出身)OnBattleNewWave(巡游下一关通知)OnContinueBattle(继续当前关卡通知)OnShowBossRage(BOSS必杀)OnShowBossRageLeftTime(BOSS必杀时间通知)OnBossInRage(BOSS进入必杀)OnFighterHurt(角色被击伤害)OnFighterCastSkill(角色释放技能)OnShowBossBuffIcon(显示bossbuff)OnRemoveBuffIcon(移除bufficon)OnFighterLifeChanged(角色生命变化)¬ OnFighterEnergyChanged(sp变化)OnFighterSkillCDChanged(技能cd变化)OnShowFighter(显示角色、新手战用到)OnShowSkillPrefab(技能中加载prefab)OnCloseSkillPrefab(技能中关闭prefab)OnBattleUIVis(战斗UI显示)
- lua调用战斗录像开始:ReplayBattle(解析战斗录像为json对象。根据json对象创建录像并且开启录像战斗)OnReplayEnd(录像结束.通知录像UI结束)23.战斗结束:OnBattleEnd(战斗结束处理)根据不同战斗类型处理不同战斗结束,分发不同UI战斗结果通知
- 强制战斗结束:OnBattleForceStop 处理强制战斗结束的事件分发UI层
- 战斗胜利:OnBattleWin 处理战斗胜利结果并通知对应UI层
- 战斗失败:OnBattleFailed处理战斗失败结果并通知对应UI层
- boss警告显示:ShowBossWarning
- 巡游战斗开始巡游:OnBeginSearch(创建添加角色到战斗。设置跟随camera)
- 异步加载角色完成后的通知:OnLoadTeam
- 录像角色加载完成后的通知:OnReplayBattleLoadedOk
- 开始加载角色处理:LoadRole(lua通知处理、加载标记设置、预加载角色load)
- ui层创建角色的回调:OnLoadRoleCompleted
- 刷新角色模型:NotifyRefreshRoleView脏标记、CheckRoleModel(根据脏标记bRoleModelDirty 是否更新由lua层更新RefreshRoleView)
- 开始加载处理:OnLoadBegin(通知lua层加载开始)OnLoadComplete(加载完成通知lua)OnLoadProgress(加载进度lua通知)
Actor文件夹处理角色属性数据: ActorDat.cs基类实现有:伙伴、主角、宠物。一级属性、二级属性、技能、avatar、buff、mark等相关数据。 ActorDataMgr.cs 角色属性管理:创建、移除、检查 BaseBattle.cs负责包含战斗整体(BattleField)逻辑控制、战斗角色管理、随机种子、战报、战斗事件注册和调度、 (basebattle派生有TimeBattle.cs、VersusBattle.cs、LogicBattle.cs、BossBattle.cs)对应不同战斗类型
BaseBattleScene.cs负责战斗场景加载、出生点、战斗点、场景天空材质 (派生有:BossBattleScene、VersusBattleScene、TimeBattleScene、LogicBattleScene)
LogicField.cs 基础逻辑块 包含有位置信息以及操作(派生有: BattleField)
BattleField.cs负责战斗中某一阶段的逻辑模块.包含该模块战斗角色 (派生有: BossBattleField、VersusBattleField、LogicBattleField、TimeBattleField)
所有战斗组成:(差异业务逻辑不同、具体业务看需求) Battle、BattleState、BattleField、BattleScene
- BattleState:创建管理多个战斗节点状态(战斗预加载、战斗开始、战斗中、战斗胜利、战斗失败、战斗结束)每个状态包含对应进入,退出。用于控制整场战斗(大的战场。包含有若干个小的子战斗)
- BattleField:创建管理每场战斗中的战斗逻辑节点状态(准备阶、过场、角色跑到战场、战斗、胜利、失败、结束)(大战场里面的子战斗)
- BattleScene:战斗场景的加载、出身点的获取、天空材质等
- Battle管理BattleField、BattleState、BattleScene、ActorData交互调度
FighterManager角色管理类:创建、销毁、复活 Fighter角色类:派生自LogicTransfor逻辑移动类 变量:FighterAi 角色AI控制(自动调用释放技能) PassiveMove 移动控制 FighterStateData 角色状态数据 角色状态FighterState 角色技能数据FighterSkillStateData 角色buff管理FighterBuffManager 角色效果管理FighterBuffFunctionMgr 角色Mark管理MarkMgr 角色控制FighterGoCtrl
角色战斗属性PlayerActorBattleAttr 战斗中使用用到的属性,参与战斗计算 方法:CreateFighter根据ActorData角色属性创建。 ForceIdle、ForceComing、ForceBreak设置切换角色状态 ChaseTo 移动到Figher一定范围 AutoMoveTo 移动到坐标 OnFightingStart 战斗开始通知调用:启用角色AI、关闭寻路、刷新角色HP、SP等UI操作 OnFightingEnd 战斗结束调用:关闭AI、清空角色BUFF和效果,开启寻路 CheckPassiveSkill 被动技能释放激活 DoPassiveSkill 指定释放激活一个被动技能 GetPassiveSkill 获取被动技能 OnEnterRage 狂暴状态的buff释放 GetAttrByType 获取角色属性 HaveBuffFunction 是否存在buff效果 RemoveFunctionByFunType 移除buff效果 GetBuffFunctionValue 获取buff效果对应值 GetMarkFunVal 获取mark对应值 Dispose 清空角色包含数据 Destroy 销毁角色 AutoRunToFieldFightPosition 是否可以跑向战斗点 CanMove 是否可移动判断 CastBuff 释放一个buff GetSkill 获取技能 Spawn 战场出身:加载模型、设置出身位置、初始化战斗属性、初始化战斗状态 DoBeHit 被攻击:切换到被攻击状态 CanDoTriggerAction 是否可以切换到指定状态 CanDoSkill 是否可以释放该技能,判断是否在不可释放状态、是否CD未到、SP消耗是否足够、选取目标、距离内是否有目标、目标距离不够则移动到目标(同时判断是否可移动) CheckDoSkill 是否可以释放技能,如果可以,释放。 ForceDoSkill 强制释放一个技能 ProcessTriggerSkillBuff 事件触发BUFF处理 ProcessTriggerBuff 被动技能的触发buff处理 AddTriggerBuffData 添加触发BUFF数据 CheckPassiveBuffCaster 是否可以触发被动效果判断 ProcessBeHit 被攻击处理 ProcessReflectDamage 反弹伤害处理 EndSkill 结束技能处理,参数是否被打断 ChangeSkill 替换技能 LoadSkills 技能预加载
战斗AI FighterAi.cs Update优先检测释放技能其次检测释放普攻,技能释放成功取下一个技能继续尝试释放mFighter.CheckDoSkill
AI攻击流程:尝试释放技能、释放成功后累计下一个尝试释放、mFighter.CheckDoSkill是否可释放、mFighter.ProcessTrigger切换技能状态、进入角色Attack状态、进入状态后调用FighterSkillStateData.OnEnter释放角色技能、并记录当前释放技能相关信息、调用触发技能BUFF、BUFF中读取相关buff.XML配置文件、触发事件。BattleBuff.ProcessEvent处理相关事件
技能运行中FighterSkillStateData.UpdateFrame检测技能帧是否播放完毕并标记。外层Attack状态根据标记状态退出攻击状态.完成一次攻击 战斗buff
根据BUFF SkillActionFrameEvent 数据,更新帧事件。生命周期自身计算
lua部分代码说明
OnConfigMgrInited=>start: OnConfigMgrInited(LaunchLoadMgr.cs)
InitMgr=>operation: InitMgr(LuaMgr.cs)
LuaMain:Init=>operation: LuaMain:Init(LuaMain.lua)
LuaMain:Start=>operation: LuaMain:Start(LuaMain.lua)
LuaMain:Update=>operation: LuaMain:Update(LuaMain.lua)
LuaMain:EnterLogin=>operation: LuaMain:EnterLogin(LuaMain.lua)
OnConfigMgrInited->InitMgr->LuaMain:Init->LuaMain:Start->LuaMain:Update->LuaMain:EnterLogin
lua启动逻辑如上流程
| 目录 | 说明 |
|---|---|
| Assets/Lua/Config | 放置的lua配置文件 |
| Assets/Lua/Core | 启动文件,平台设置,通用设置等 |
| Assets/Lua/Entities | 早期做场景互动功能使用,当前版本无用 |
| Assets/Lua/Enum | 枚举数据 |
| Assets/Lua/ForceGuide | 强制引导相关 |
| Assets/Lua/FSMState | lua中的状态机 |
| Assets/Lua/FuncUnlockCondition | 功能解锁的判定条件 |
| Assets/Lua/GmCommond | gm工具 |
| Assets/Lua/Logic | 游戏的逻辑数据保存地方 |
| Assets/Lua/Managers | 一些调度的管理类 |
| Assets/Lua/Pb google | protobuf协议文件 |
| Assets/Lua/RedPoint | 红点逻辑 |
| Assets/Lua/System | 通用功能 |
| Assets/Lua/UI | 所有的UI逻辑(vc) |