Code Monkey home page Code Monkey logo

luopeiyu / unity_net_book Goto Github PK

View Code? Open in Web Editor NEW
170.0 5.0 39.0 2.57 MB

《Unity3D网络游戏实战(第二版)》以制作一款完整的多人坦克对战游戏为例,详细介绍网络游戏的开发过程。透过本书,读者能够掌握Unity网络游戏开发的大部分知识,能够深入了解TCP底层机制,能够亲自搭建一套可重复使用的客户端框架,也能够从框架设计中了解商业游戏的设计思路。

unity_net_book's Issues

调试过程中发现的客户端NetManager.cs 代码bug

在测试书籍附加的代码时,经过debug发现存在以下两个问题:
以下两个问题均在 客户端代码的NetManager中。

问题1: msgListeners字典管理不当,产生空指针

调试过程中,发现一局游戏结束后,再次从房间进入游戏,程序会直接报错跳出。

针对RemoveMsgListener函数:

//删除消息监听
public static void RemoveMsgListener(string msgName, MsgListener listener){
  if (msgListeners.ContainsKey(msgName)){
	  msgListeners[msgName] -= listener;
  }
}

在一局游戏结束后会执行RemoveMsgListener函数,把msgListeners字典的某个value删了,但key却没删。
当再次从同一个房间开启下次游戏的过程中,msgListeners 中 仍然有 msgName 作为key,但其对应的 value 却是 null。此时执行很多别的函数,if(msgListeners.ContainsKey(msgName))均为真,但此时其值为null,故报错跳出。如:

//分发消息
	private static void FireMsg(string msgName, MsgBase msgBase){
		// Debug.Log(msgName);
		if(msgListeners.ContainsKey(msgName)){
			msgListeners[msgName](msgBase);
		}
	}

故RemoveMsgListener 函数应改为:

//删除消息监听
public static void RemoveMsgListener(string msgName, MsgListener listener){
if (msgListeners.ContainsKey(msgName)){
	msgListeners[msgName] -= listener;
	if (msgListeners[msgName] == null)
	{
		msgListeners.Remove(msgName);
	}
}
}

即删除完value后判断 key对应的value是否为空,若为空,则连着key一起删了。防止 key对应 null的情况出现。

RemoveEventListener 函数同理,不再赘述

问题2 运行正常,但debug单步调试卡在SendCallback函数运行不下去。

对于 SendCallback 函数,有这一串代码:

lock(writeQueue){
   writeQueue.Dequeue();
   ba = writeQueue.First();
}
}

虽然正常运行没有问题,但其中:ba = writeQueue.First(); 会卡住debug,无法单步调试,让debug过程非常恶心。
猜测原因是debug过程中 writeQueue 经常为空,故 writeQueue.First() 返回值异常导致卡死。

经过玄学调试,将其改为:

lock(writeQueue){
writeQueue.Dequeue();

if (writeQueue.Count > 0) {
	ba = writeQueue.First();
} else {
	ba = null;
}
}

之后,debug就可以正常进行了。

更改后的代码见附件
NetManager.txt

不知道是不是勘误

前几天买了您的书,把socket讲的通俗易懂,分析了网络通信是遇到问题的解决方案,最喜欢的是图表。

另外本人发现一处勘误,不知道是不是我理解错了。在129页 图4-49那里,移动了数据,应该writeInx之后数据为空,可是印刷上却是4和5,不知道是我理解问题,还是勘误。

勘误(?还是该叫补充...):3.4.5节 测试网络模块

作者您是否是忘记提示读者在该章节Main组件里的Update函数里调用NetManager模块的Update函数了。
虽然可能是个很小很小的问题,但因为是初学者,我学到这的时候把所有代码弄好了没法在客户端收到服务端传来的消息,检查了客户端确实能接收到消息,但是打印部分放在NetManager模块的Update函数里的,所以不调用Update的话客户端并不会打印消息。在这里提醒一下。十分感谢。

第二版第8章的一些代码问题

首先感谢大大写了这本书,个人受益匪浅。
我在阅读第8章的过程中发现了一些小问题,希望能为勘误提供一些帮助。
p249移动控制坦克的最后一行代码
transform.transform.position += s;
这里应该是多了个transform(虽然没影响)

另外p258的计算相机位置的代码遗漏了函数名,应该是调用的插值函数Vector3.Lerp
cameraPos = (cameraPos,targetPos,Time.deltaTime * speed)

游戏开发最常用的是TCP协议

我现在用的网络的东西比较少,但是像是mirror使用的默认协议是KCP,就是基于UDP的可靠协议,我也感觉基于UDP的可靠协议应该是最常用的,为啥TCP是最常用的啊。像断线重连用的QUIC协议也是一种可靠UDP协议。

勘误+建议

非常感觉大佬写了这本书,它帮我梳理了这几年对框架的一个理解,也补了很多知识。我现在已经把它读完了,也把书上所有代码都测试了一遍。以下是对本书的勘误和建议,如果能对作者和正在学习它的人起到一些帮助就好了。

  1. 第2页,图1-3,右边方框里“客户端”应为“服务端”
  2. 第102页,图4-17,倒数两条缓冲区示意图是不是多余的?
  3. 第221页,第一行,MysqlCommand cmd = new MysqlCommand(s , mysql);这样写测试会有 There is already an open DataReader associated with this Connection which must be closed相关报错。虽然我在后面看到了有关闭DataReader的代码,但还是先用using (MysqlCommand cmd = new MysqlCommand(s , mysql) )通过测试会不会更好些?
  4. 第281页,9.4.1第一段第二行,“分别有Layer.Panel和Layer.Panel两项”应为“分别有Layer.Panel和Layer.Tip两项”

一些建议:

  1. 我在测试第三章大乱斗游戏时,已经发生了粘包问题,不过当时还没有看到第四章,所以我用自己的方法解决了问题。如果可以稍微提一句可能发生问题会在第XXX章介绍就好了。
  2. 使用Unity2018(目前最新2018.3.11f1仍未修复)生成的exe,会有点击UI按钮不响应的问题,所以我的测试都是在2017.2.1f1版本上完成的。
  3. 第六章介绍的Protobuf,一般大家都是想要批处理生成文件的吧,这里有一个Protobuf批处理工具链接

异步和多路复用应用场景问题?

你好 最近在读您的第二版书. 里面说这一版本将采用多路复用. 而第一版采用了异步.

请问除了使用多路复用会让程序看起来更清楚些? 会有什么坏处吗?

两者相比较 在何种情况A比B好 或者B比A好呢?

[建议]6.6测试OnMove提醒一下响声的原因

测试的时候总是响,VS又不报错,DEBUG了一下午,原来是转移字符的问题,'/a'响铃。
OnMove协议编码后:
55-0-7-0-77-115-103-77-111-118-101-123-34-112-114-111-116-111-78-97-109-101-34-58-34-77-115-103-77-111-118-101-34-44-34-120-34-58-49-50-48-44-34-121-34-58-49-50-51-44-34-122-34-58-45-54-125
使用string recvStr = System.Text.Encoding.Default.GetString(state.readBuff, 0, count);解码后:
7\0\a\0MsgMove{\"protoName\":\"MsgMove\",\"x\":120,\"y\":123,\"z\":-6}
泪目了。。。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.