序章
话说在那遥远之地,有一片神秘的大陆。。。
“为什么是大陆,而不是星球呢?”
“很简单,这样逼格比较高。而且,你不感觉,神秘的大陆比神秘的星球顺口多了吗?”
“潘多拉什么的也是神秘的星球啊。”
“你这孩子,还想不想听故事啦?!”
“行吧,你总是这样。”
这片大陆上,有两个对立的阵营,一边是红色的熊,一边是黄色的鹰。
“黄色和红色?”
“是的,虽然冥冥之中感觉应该是红蓝,但是不知道何故,他们只有红黄。”
他们终日打斗,互相攻击对方,于是这片大陆因此战火连天。但是——
“我的回合,我建造一辆‘磁能坦克’。回合结束。“
”轮到我了,磁能坦克能够攻击我方同一行的三个单位,看来你想玩AOE啊,出来吧,我的最强王牌,光棱坦克!!“
。。。
该死,光棱坦克的射程高达三格,我的磁能坦克只有一格,它打的到我,我打不到它。
怎么办,难道只能束手就擒?
”轰轰轰!!“
一声声巨响突然在这群少年附近响起,敌人来了!
”究竟什么才能赢得这场胜利?“少年还在呆立着。
”我知道了,唯有熊国人才知道什么能打败我国的光棱坦克,我要去对面找到答案!“
数年过去了。。
”后来呢?他找到答案了吗?“
”不清楚,但是他们当初玩笑做出来的卡牌游戏,却成为了那座神秘大陆最重要的组成部分,越来越多的人放下了武器,加入了这场犹如玩具的卡牌游戏中,战火居然因此平息下来。“
”那,那个游戏叫什么?“
”那个游戏啊,叫做《决战!红黄卡牌!》,那个大陆也变成了这个卡牌游戏的背景故事,真实。“
故事到此就结束了。
(作者:我是现编的,你们信不?)
第一章
游戏构造
先粗略讲讲游戏的构造。
该游戏是一个1v1在线对战的卡牌游戏,首先它的服务端是由Springboot的WebSocket写的,客户端是Unity。
然后,我将游戏分为几个模块:登录模块(登录和注册)、大厅模块(创建房间、加入房间)、游戏模块。
游戏模块又可以细分为(UI系统、建造系统、战斗系统、技能系统、结算系统)
是的,很出大家意料的是,大部分脚本都是挂载在摄像机上的。
登录模块和大厅模块,都是短连接,就是我们常说的Get/Post请求。
游戏模块则是长连接,即websocket。
当玩家加入房间时,它就像服务端发送连接websocket服务器的请求,然后服务端将整个房间对象都存起来。其中房间对象包含了房间信息和玩家信息,每个玩家信息又对应着它的session对象。每次需要进行消息同步时,就由服务端向房间内所有人进行群发即可。
————————
由于服务端能够查看房间对象中的玩家数,就可以从玩家数判断该房间是否满人,而这部分被存进数据库中,做为一个标识。
设定是,当有人退出房间时,房间则销毁,同时会销毁对应的session对象及数据库中的房间数据。
(如果有人暂时掉线怎么办?很简单,谁掉线谁输。是的,我没有写断线重连的机制。)
————————
客户端的同步是如何实现的呢?
每当用户执行一个操作,比如:玩家1在坐标(0,0)建造了一个单位。这个时候该操作并没有在客户端执行,它先将一串数据发送给服务端,由服务端做群发操作。客户端接收到信息后,在指定位置上建造单位,如此实现了数据的同步。
第二章
遇到的一些坑
游戏的逻辑其实非常简单,开发过程中最难的,我认为还是调试过程。
我经常用debug.log()来调试,其实更应该是用vs自带的Debug更好。
- 第一个坑,莫过于GetCompontsInChild()了,说到底,我百度了“如何查找子对象”时候,没有想过说,它会把整个根节点下所有节点都当成子对象,包括根节点自己。
- 第二个坑,协程。如果一个协程是有返回值的,yield return data。我们在协程后面,能立刻获取到data吗?不能。导致了我每个需要发送请求的敌方就要写一个协程。(吐血)
- 第三个坑,指针引用和值引用,c#和java还是有点不一样嘛
- 。。。
不止这些坑,我写了几个印象深刻的。
第三章
关于具体的流程
如何建造单位?
- 首先,登录游戏时,我先通过简单的get获取到所有单位的信息,还有玩家的初始信息,将它们存进客户端,这里我用了一些简单的static数据将它们存下来。
- 接着,进入游戏时,遍历我摆好在页面上的几个单选按钮,然后把这些单位 Pia 上去,然后顺便绑定了点击事件。
- (我喜欢上了 AddListen()这个东西)
- 然后,遍历所有可以放置单位的格子,也给它们绑定了点击事件。
- 事情就变得很简单了,选择一个单位,然后把这个单位放到指定格子上,最后按照前面同步数据方法同步即可。
如何战斗?
- 首先,我为了节省工作量,战斗是自动战斗的,就是回合结束后,双方就 PiPi PaPa 打起来。(在没有动画和声音下,真是一种神奇的画面啊,但是我还是给他们加上了血条)
- 接着,双方客户端开始各自操作,遍历我方所有单位,执行它们的ATK()方法。
- 然后,将战场的场景数据,玩家的数据发送给服务端。
- 最后,服务端把数据同步,群发回来,同步场景。
建造格子、单位、单位数据的关系?
- 建造格子是一个简单的Button控件,然后有个脚本BuildPos挂载在格子上,BuildPos上有一个值,叫做ImageUnit,是一个Image的数据。
- 不错,每个单位都是一个Image对象,建造单位就是new了一个Image,然后将这个对象放到指定位置上而已。
- Image预制体,就是单位,默认携带了一个Unit脚本。
- 该Unit脚本又携带了一个UnitData的数据类。
- Unit包括了攻击、防守、扣血、及相关的UI操作,比如血条显示。
- UnitData的数据从静态数据类clone而来。
第四章
目前的状况
到今天,流程终于跑通了,建造、战斗、返回大厅等。
现在是填充数值的时候,遗憾的是,数值崩了。
我设计了六个战斗单位的技能,代码实现了两个,设计了三重科技,还没写。。
所以,咳咳。
未完待续。
暂无关于此日志的评论。