luopeiyu / unity_net_book Goto Github PK
View Code? Open in Web Editor NEW《Unity3D网络游戏实战(第二版)》以制作一款完整的多人坦克对战游戏为例,详细介绍网络游戏的开发过程。透过本书,读者能够掌握Unity网络游戏开发的大部分知识,能够深入了解TCP底层机制,能够亲自搭建一套可重复使用的客户端框架,也能够从框架设计中了解商业游戏的设计思路。
《Unity3D网络游戏实战(第二版)》以制作一款完整的多人坦克对战游戏为例,详细介绍网络游戏的开发过程。透过本书,读者能够掌握Unity网络游戏开发的大部分知识,能够深入了解TCP底层机制,能够亲自搭建一套可重复使用的客户端框架,也能够从框架设计中了解商业游戏的设计思路。
测试的时候总是响,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}
泪目了。。。。
如题.
在测试书籍附加的代码时,经过debug发现存在以下两个问题:
以下两个问题均在 客户端代码的NetManager中。
调试过程中,发现一局游戏结束后,再次从房间进入游戏,程序会直接报错跳出。
针对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 函数同理,不再赘述
对于 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
我现在用的网络的东西比较少,但是像是mirror使用的默认协议是KCP,就是基于UDP的可靠协议,我也感觉基于UDP的可靠协议应该是最常用的,为啥TCP是最常用的啊。像断线重连用的QUIC协议也是一种可靠UDP协议。
作者您是否是忘记提示读者在该章节Main组件里的Update函数里调用NetManager模块的Update函数了。
虽然可能是个很小很小的问题,但因为是初学者,我学到这的时候把所有代码弄好了没法在客户端收到服务端传来的消息,检查了客户端确实能接收到消息,但是打印部分放在NetManager模块的Update函数里的,所以不调用Update的话客户端并不会打印消息。在这里提醒一下。十分感谢。
第106页有一句代码:
recvStr = s + "\n" + recvStr
这句代码我打印出的recvStr 是最新一条信息内容,并没有包含历史消息。
首先感谢大大写了这本书,个人受益匪浅。
我在阅读第8章的过程中发现了一些小问题,希望能为勘误提供一些帮助。
p249移动控制坦克的最后一行代码
transform.transform.position += s;
这里应该是多了个transform(虽然没影响)
另外p258的计算相机位置的代码遗漏了函数名,应该是调用的插值函数Vector3.Lerp
cameraPos = (cameraPos,targetPos,Time.deltaTime * speed)
你好 最近在读您的第二版书. 里面说这一版本将采用多路复用. 而第一版采用了异步.
请问除了使用多路复用会让程序看起来更清楚些? 会有什么坏处吗?
两者相比较 在何种情况A比B好 或者B比A好呢?
非常感觉大佬写了这本书,它帮我梳理了这几年对框架的一个理解,也补了很多知识。我现在已经把它读完了,也把书上所有代码都测试了一遍。以下是对本书的勘误和建议,如果能对作者和正在学习它的人起到一些帮助就好了。
一些建议:
前几天买了您的书,把socket讲的通俗易懂,分析了网络通信是遇到问题的解决方案,最喜欢的是图表。
另外本人发现一处勘误,不知道是不是我理解错了。在129页 图4-49那里,移动了数据,应该writeInx之后数据为空,可是印刷上却是4和5,不知道是我理解问题,还是勘误。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.