2018.5.6之前
这段时间主要是搭建框架,并完成了注册,登录,创建角色功能。
大致流程如下:
构思框架->设计服务端框架->设计通信协议->设计客户端框架->验证通信协议
由于这之前我并未有开发网络游戏的经验,所以这部分参考siki dalao的《丛林战争》和罗培羽dalao的《Unity 3D 网络游戏实战》,不过这两个项目跟《樱色伊始》需求有些出入,就综合了一下。
通信协议我分了四级,RequestCode – ActionCode – ReturnCode – 内容
服务端:首先通过RequestCode 在Dictionary中查找对应处理Class,然后通过反射机制查找ActionCode对应的method,ReturnCode就是简单的结果码,诸如Success,Fail之类。
最后跟的就是内容,比如如果是登录功能:
User – Login – None – Username + Password
客户端:客户端维护了一个消息队列和委托Dictionary,在发送请求的同时处理返回结果的方法注册到Dictionary中。
客户端每帧处理若干条协议,通过Action匹配Dictionary中的委托。
服务端框架和客户端框架有些复杂,等之后我会再写篇文章进行详细解析。
// 设计协议的时候也有个坑,原型我是参考一本书的。刚开始使用没问题,后来在发送角色基本数据(协议数据比较长)的时候发现总会丢失4个字节的内容。
// 测来测去,最终发现是书上搞错了字符串的长度和字符串字节数组的长度。而这个bug在某些情况下又是不存在的。。
// 总之还是不要太相信“权威”
->实现创建,登录功能->实现选择,创建角色功能
->设计角色动作状态机
// 这个地方必须得吐槽下,没有合适的动作素材真难受,为了实现流畅的动作,我到处找素材,淘宝,论坛逛了一遍,始终没找到合适的。。
// 就现在用的动作还是从三套模型上抠出来的。。
->实现摄像机跟随角色的功能
// 这里有个细节,在实现摄像机自动拉近与被遮挡角色距离的时候,碰到射线无法检测部分物体的物品,后来发现是因为摄像机处于collider内部,而从内部发出的射线是无法检测collider边缘的。
// 换了下思路,改为从角色像摄像机方向发射射线,问题解决。
2018.5.6
回头看了下前段时间写的代码,发现有部分已经快看不懂了。。(捂脸)
论注释的重要性
今天添加了删除角色功能,不过删除确认还没做,等开发到之后扔掉背包物品和退出游戏时一并做吧_(:з」∠)_
做了这么久,最让我头痛的还是模型动作的问题,除非我愿意去学习3dsmax或者有建模师帮我,不然我真的一点办法都没有。。
只能先将就着用了。。
希望到时候面试时dalao不要介意。。
2018.5.7
今天是“沉重”的一天。。
让我担心的事最终还是发生了。。
设计客户端架构时经验不足,没有认真考虑到Unity执行脚本的生命周期而埋下的隐患,导致今天在改写功能的时候各种空指针引用。。
痛定思痛,花了点时间对核心脚本进行了重构,抛弃了先前的GameFacade脚本,并将其功能整合到了GameRoot脚本中。
暂时做如下设计
不知道效果咋样,等下课了回去试试_(:з」∠)_
*****************
改写之后,无bug一遍过
看来新结构行得通2333
2018.5.8 Scene加载与切换
今天试着做了下异步加载Scene功能_(:з」∠)_
目前游戏有四个Scene,加载流程如下
欢迎Scene -> 登录与注册相关Scene -> Load Scene -> 游戏Scene
其中Load Scene是专门用来显示加载进度条的,比如说从Scene 1 到 Scene 2,
Scene 1 中使用SceneManager.LoadScene() 直接加载LoadScene(因为很小,只有进度条,所以可以做到秒加载)
然后在LoadScene中使用SceneManager.LoadSceneAsyc()异步加载Scene2 ,加载过程通过其返回值AsyncOperation中的progress参数获取加载进度。
需要注意的是SceneManager.LoadSceneAsyc()加载完毕默认会直接切换到目标Scene,如果想手动控制切换时机的话设置AsyncOperation.allowSceneActivation为false,等到需要切换时再设为true。另外把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载。
5.9 – 5.13
最近心态有点不好 T T
不过已经缓过来了,明天继续!
5.14
做了些UI,比如角色属性,状态栏啥的,
还有设计了下地图
好像没啥好说的。。
5.15 角色属性读取
目前设计的是将角色不同等级的基础属性,比如HP,暴击率什么的做成Json文件保存在客户端。在生成角色或角色升级时进行加载。
(数值设计暂且不考虑)
后期装备也准备这样做,角色总属性 = 基础属性 + 装备属性;
放在本地可以减轻服务器的压力,当然这样做有个很大的缺点,数据容易被篡改(作弊)。。
将其保存在服务器数据库实现起来应该不会太难,不过暂时先这样用着 _(:з」∠)_
5.16
增加了“删除角色”确认对话框,防止误删除;
完善了角色状态的UI显示,并能根据登录角色加载不同的角色到游戏中;
制作了角色暴击特效(暴击时在角色背后生成一个“假人”);
开始制作包裹系统,由于以前有做过这个东西,所以大部分用的都是原来的代码,改动下就可以用了;
5.17
新增了穿上、脱下装备以及同步属性面板的显示;
新增了使用药品,恢复HP,MP以及同步面板的显示;
重构基础战斗属性:HP,MP,攻击,命中率,穿刺,防御,闪避率,暴击率,暴击伤害为PropertiesModel类,并重载了其“+”,“-”操作符,使得两个PropertiesModel可以进行加减运算;
(使用场景,当穿戴一个装备时,角色的PropertiesModel+=装备的PropertiesModel)
角色持有3个PropertiesModel,一个为固定角色属性,一个为“装备属性和”,一个为总可变属性;
1.固定角色属性是指角色本身基础属性,由职业和等级决定;
2.“装备属性和”由角色所佩戴的装备决定,等于角色身上每件装备的PropertiesModel相加;
3.总可变属性由固定属性和“装备属性和”组成,其中的HP,MP字段会随着收到伤害,使用技能,使用药品等发生变化,主要用于战斗计算;
另外角色属性上限由固定角色属性和“装备属性和”构成,例如HP上限 = 基础HP + 装备HP,这个部分只有在装备发生变化时才会改变,战斗中收到伤害等情况下不会改变;
(穿上,脱下装备对HP,MP来说只会影响上限,当前HP也不会超过上限。例如角色当前HP为80/100,卸下了一个可以增加50HP的装备,HP变为50/50)
装备类物品在数据库中有个额外的标志位,“1”表示穿戴中,“0”表示未穿戴;
已知bug:
在某些情况下表示拾取中的物品的ItemUI会被Destroy,暂时没发现规律,也不知道怎么回事。。。
5.18
新增天气-雨天效果;
用粒子系统做的
emmm截图中雨滴看起来是矩形的,实际运行由于下落速度快还是挺好看的。。
顺便吐槽下剑灵的剧情。。
来个Happy Ending就那么难吗。。。
5.19
新增雨天音效,环境音效的播放;
新增小地图功能(具体做法可以看我之前的文章:在Unity中制作小地图)
新增商店功能,包括购买,出售物品及金钱的同步;
5.20
修复了出售商品时商品数量实际上不会减少的bug;
新增客户端与服务端的位置同步;
重构 PlayerController.cs 和 PlayerBattle.cs 合为Player.cs (历史总是惊人的相似)
重新设计了角色生成机制,为多人游戏做准备(脑阔痛)
5.21
说些题外话,sz做了这么久了,感觉自己的心境也在慢慢变化。
一开始只是想着做个属于自己的游戏,一步一步,一砖一瓦构建自己想要的游戏世界
但是现在,不知不觉把找工作当成了首要任务
经常担心这做不好,那做不好,面试官问起这个怎么办,做的不完美怎么办。。
有些时候真的对sz有了略微的恐惧心理 _(:з」∠)_
惭愧,可能是我对那个公司太喜欢了吧,很担心自己水平不够_(:з」∠)_
5.22 – ~~~
临近期末,各科都要做期末项目设计和实验报告,答辩啥的,比较忙。。
暂时挂起。。
6 comments
🙂
🙂 🙂 🙂
:surprised: 我快撑不下去了
加油哦
感觉好厉害,虽然看不懂哈哈哈
_(:з」∠)_ 都是一些简单的东西