暗黑战神项目总结
参考暗黑战神项目siki学院的课程,做的一个项目,自己加了一些优化。目前战斗没做完,做完后可能再发(水)一篇。siki牛逼!!!我要给siki打call!!!
课程地址http://www.sikiedu.com/my/course/330
简介
本项目是一个MMORPG,是网络游戏,主要玩法是类似暗黑破坏神,就是是刷副本PVE刷材料养成。网络都是业务层逻辑,没有帧同步。玩家可以通过摇杆移动,然后攻击和释放技能击杀怪物。实现了登录注册,强化系统,自动任务引导,世界聊天,副本业务等系统。完整的客户端,服务器,数据库三层结构。除了美术资源外,都是本人实现的,花了四个月时间。在客户端实现了资源动态加载,并设置缓存层。UI采用MVC,降低愈合,并用事件回调解决数据同步问题。项目采用数据驱动方式,所有数据采用XML配置表实现,用XML配合C#自动序列化大大减少工作量。在服务器中,使用C#序列化数据,使用socket传递数据,使用多线程处理网络IO,使用多线程实现计时回调,设置缓存层减少数据库查询。
框架
启动逻辑:只有一个启动脚本有Start入口,它会依次调用其他实现有序初始化。
Loading界面:通用,异步加载方式,用一个委托实现加载完成后的动作。
数据分三层:数据库一层,服务器缓存一层,客户端显示一层,数据同步是主要修改服务器缓存,再向数据库和客户端发送更新。
启动进入一个根场景,它有一个不会被销毁的对象,所有系统都挂在上面,此外还有UI根路径。
一般的业务流程:用户点击按钮触发按钮事件,窗口把需要的数据收集起来,然后进行验证,完成后交给网络模块发送。网络模块只发送必须的数据。服务器收到后,再次验证,然后进行对应业务处理。处理完成结果写入cache,cache把数据写入数据库。服务器网络模块向客户端发送改变后的数据。客户端收到后更新数据,并通知各个模块刷新,然后给出一条提示显示结果。
业务中的异常:收到回复前,客户端禁止其他操作,如果超过一段时间没有收到回复认为网络异常,请求失败。
数据驱动:主要数据都在配置表里,解析成XML,需要时再通过XML序列化加载。可以不用在代码中配置数据。
框架的分层:服务层,提供通用功能。有网络服务,音效服务,计时服务,资源加载服务。
业务层,实现各个业务处理。例如登录注册模块,任务引导模块,装备强化模块等。
UI层,每个界面一个UI脚本。每个界面被一个业务系统管理,不能直接访问。
服务器采用多线程+socket实现,每个连接一个线程,但是所有数据都传回主线程,防止冲突。用死循环+sleep防止服务器结束。
日志实现较简单。为了调试方便,把数据明文打到日志里,可能造成安全问题。
UI
UI逻辑框架。每个界面一个U脚本。
MVC,UI只负责数据显示,绑定按钮事件等。用一个action通知UI刷新。
UI自适应:(横屏游戏)根据上下高度缩放,设置锚点等。
UI优化:关闭不用的raycast,并且写了个脚本批量关闭。UI都在根物体上,根据需要动态加载所需的UI。
滑动列表:根据配置数据动态创建条目。
战斗模块
摇杆控制。自己实现。
动画。状态机过度,使用动画混合树平滑,还可以使用IK进行交互动画制作,特殊需求用dotween或者自己写tween动画。此外可以使用物理动画或者直接脚本控制位置。
寻路。使用navmesh。用于任务自动引导。
主城渲染优化。把环境灯光设为静态,离线渲染为光照贴图,运行就不需要计算环境灯光。可以把draw call从1000降低到100.运行后动态合批再降到16.
定时。两种方式,帧检查实现,每帧检查是否到达时间。
多线程实现,使用C#Timer,要把回调传回主线程执行防止冲突。
业务
登录:服务器启动时加载所有用户名和密码,缓存只存已经登录的用户账户信息。发送时进行验证,为空等不发。保存上次成功登录的用户名密码,下次使用这个默认的直接登录。
角色展示:使用一个摄像机拍主角,结果做成rendertexture,UI上作为图片显示它。
自动任务:数据库维护一个自动任务ID保存当前任务,客户端加载配置知道导航到谁,然后用navmesh寻路。接近到一定距离认为引导完成。
强化升级系统:根据当前点击的部位,取得对应数据,并进行显示。点升级就发送消息。
聊天系统:收到一个聊天请求就群发给登录的所有人。群发之前完成解析等重复操作,减少压力。
体力:对已登录用户,每5分钟发送一次数据通知体力增长。
对离线用户,记录最后下线时间,在上线时计算增长的体力。
任务检测:在其他系统中有Action回调,把任务检测注册到这些回调中。注意在任务完成后删除回调。