Unity3D 网络游戏实战(第2版)

2021-12-15  本文已影响0人  学识浅薄的胖

书籍作者: 罗培羽 著
ISBN:9787111612179
推荐程度: 有编程经验的,强烈推荐

在学习 Unity 3D 的过程中,从图书馆借来了此书。该书总体由浅入深,步骤清晰,文字简练,在阅读学习过程中,发现存在少许错误,特此记录。

书中大部分工程使用的 Unity 版本为 2017.3.0f3,本人使用的 Unity 版本为 2019.4.31f1c1 。经过代码实践,书中大部分函数均与 2019 一致,存在不同时,会在本文列出。

第 1 章 网络游戏的开端:Echo

第 3 章 实践出真知:大乱斗游戏

// 声明时初始化
public Dictionary<string, BaseHuman> otherHumans = new Dictionary<string, BaseHuman>();

// 或者 在 Awake 里初始化
private void Awake()
{
    otherHumans = new Dictionary<string, BaseHuman>();
}

第 4 章 正确收发数据流

string s = System.Text.Encoding.UTF8.GetString(readBuff, 2, bodyLength);
public int Read(byte[] bs, int offset, int count){
  count = Math.Min(count, length);
  // 此处应修改为 readIdx
  Array.Copy(bytes, readIdx, bs, offset, count);
  readIdx += count;
  CheckAndMoveBytes();
  return count;
}
if ( readBuff.length <= 2 )
  return;
int readIdx = readBuff.readIdx;
byte[] bytes = readBuff.bytes;

Int16 bodyLength = (Int16) ((bytes[readIdx + 1] << 8) | bytes[readIdx]);

// 此处存在错误, length 包括了长度的两个字节,实际应为 readBuff.length < 2 + bodyLength
if (readBuff.length < bodyLength)
  return;

readBuff.readIdx += 2;

结合书中对 ByteArray 的方法描述,应修改为以下代码:

if ( readBuff.length <= 2 )
  return;

// 注意 ReadInt16 函数内,会对 readIdx 执行 + 2 操作
Int16 bodyLength = readBuff.ReadInt16();

// 由于 length 指的是 writeIdx - readIdx , 所以可直接与 bodyLength 比较

if (readBuff.length < bodyLength)
{
  // 如果字节数达不到长度,则需要继续等待接收,并将 readIdx 还原为读取长度之前
  readBuff.readIdx -= 2;
  return;
}

第 7 章 通用服务端框架

...
catch(Exception e){
  // 书中描述为 IsSafeString
  Console.WriteLine("[ 数据库 ] IsAccountExist err, " + e.Message);
  return false;
}

第 8 章 完整大项目《坦克大战》

// 原文代码
void LateUpdate(){
  // ... 前面代码省略,此处有误
  // 应为 Vector3.MoveTowards(cameraPos, targetPos, Time.deltaTime * speed);
  cameraPos = (cameraPos, targetPos, Time.deltaTime * speed);
}

第 9 章 UI界面模块

public override void OnShow(params object[] args){
    // 前面代码省略...
    NetManager.AddMsgListener("MsgRegister", OnMsgRegister);
}

public override void OnShow(params object[] args){
    // 前面代码省略...
    NetManager.RemoveMsgListener("MsgRegister", OnMsgRegister);
}

第 10 章 游戏大厅和房间

第 11 章 战斗和胜负判定

上一篇下一篇

猜你喜欢

热点阅读