前几天在 游戏蛮牛论坛 发现一篇文章 《Socket联机版五子棋》, 东方喵的版本,逻辑判断在服务器端,基于 Unity TcpClient。
初衷
因为个人挺喜欢五子棋游戏的,而且每天中午跟同事一起吃饭时,等餐时间,没事可干,他们都是埋头“搞机”。
所以呢,我打算重写下五子棋这个游戏,在等餐的时候可以直接用手机来一局。
现在每天中午我们都要来一局,其乐无穷!!!
感谢
感谢东方喵分享的资源;
感谢天梯实时对战服务的商务小伙伴的热情帮忙及联机服务的支持。
下面呢,就给大家分享下实现过程。
关于游戏
暂定名: GobangOnline
网络协议: UDP
匹配:两玩家随机匹配(也有计划加上 房间号或者密令匹配对战 和 局域网联机对战);
先来张配图:
(带红点的棋子为最后落子标记)
游戏截图
涉及同步数据
匹配成功玩家昵称同步
玩家落子数据同步
胜负同步
玩家昵称同步
和一个朋友争论了好几次,还是决定把玩家输入昵称的逻辑保留下来。
玩家启动游戏,输入昵称,既可联机对战(昵称保存到本地)。
1,输入昵称,点击“登录”,将直接进入匹配对手界面。
UIManager.cs
public void onButtonClick(string name) {
if(name == "")
return;
switch (name) {
case "level":
// 昵称不能为空
GameObject mainObj = ui.transform.Find ("Main").gameObject;
GameObject textObj = mainObj.transform.Find ("InputField/Text").gameObject;
GameObject errorTipObj = mainObj.transform.Find ("ErrorTip").gameObject;
string nickname = textObj.GetComponent ().text;
if (nickname == "") {
errorTipObj.SetActive (true);
return;
}
GameManager.nickname = nickname;
// 记录 nickname
PlayerPrefs.SetString ("nickname", nickname);
errorTipObj.SetActive (false);
mainObj.SetActive (false);
// 等级匹配
GobangClient.connect (8);
break;
case "retry":
GobangClient.disconnect ();
break;
}
}
2,匹配成功后,发送握手交换名片(昵称)数据。
GobangClient.cs
// GobangClient 主要重写 Nanolink实时对战服务已封装的 onMessage, onResync, onStatusChanged, onConnected, onDisconnected 方法。
// 重写接受到数据的响应函数,在GameManager.recvMessage()中统一处理接收到数据
protected override void onMessage (byte[] data, byte fromIndex) {
// Hashtable values = GameSerialize.fromBytes (data);
GameObject gameObj = GameObject.Find ("Game");
if (gameObj == null)
return;
GameManager gameManager = gameObj.GetComponent ();
if (gameManager == null)
retu