diff options
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | 140 |
1 files changed, 78 insertions, 62 deletions
diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs index 3336804..4a68332 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs @@ -135,7 +135,7 @@ namespace InnerNet internal const byte ReadyFlag = 7; - internal const byte ChangeSettingsFlag = 8; + internal const byte ChangeSettingsFlag = 8; // 没用这个类型的消息,采用Rpc实现的 // 每次发送数据的间隔,每过0.1s发送一次 public float MinSendInterval = 0.1f; @@ -155,6 +155,7 @@ namespace InnerNet private Dictionary<uint, InnerNetObject> allObjectsFast = new Dictionary<uint, InnerNetObject>(); + // 2个 private MessageWriter[] Streams; public enum GameStates @@ -175,6 +176,7 @@ namespace InnerNet // 初始化 public virtual void Start() { + // 场景切换,包含很多场景,EndGame、MainMenuScene、MMOline等场景 SceneManager.activeSceneChanged += delegate(Scene oldScene, Scene scene) { this.SendSceneChange(scene.name); @@ -636,7 +638,7 @@ namespace InnerNet public MessageWriter StartEndGame() { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); - messageWriter.StartMessage(8); + messageWriter.StartMessage(8); // endGame messageWriter.Write(this.GameId); return messageWriter; } @@ -660,6 +662,7 @@ namespace InnerNet messageWriter.Recycle(); } + // 发送已经准备好的消息 protected void SendClientReady() { if (!this.AmHost) @@ -767,7 +770,8 @@ namespace InnerNet HostGame = 0, // 创建 StartGame = 2, // 开始游戏 Disconnect = 3, // 断开 - SubMessage = 6, // + GameData = 5, + GameDataTo = 6, // JoinGame = 7, // 加入游戏 Gameover = 8, // 游戏结束 } @@ -817,11 +821,11 @@ namespace InnerNet } case 4: break; - case 5: - case (int)TagAlias.SubMessage: // 把这类消息存在队列里,主线程后续调用 + case (int)TagAlias.GameData: + case (int)TagAlias.GameDataTo: // 把这类消息存在队列里,主线程后续调用 { - int num = reader.ReadInt32(); - if (this.GameId == num) + int gameId = reader.ReadInt32(); + if (this.GameId == gameId) { if (reader.Tag == 6) { @@ -1178,7 +1182,7 @@ namespace InnerNet protected void SendInitialData(int clientId) { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); - messageWriter.StartMessage(6); + messageWriter.StartMessage(6); // 6 = scene change flag messageWriter.Write(this.GameId); messageWriter.WritePacked(clientId); List<InnerNetObject> obj = this.allObjects; @@ -1190,6 +1194,7 @@ namespace InnerNet InnerNetObject innerNetObject = this.allObjects[i]; if (innerNetObject && hashSet.Add(innerNetObject.gameObject)) { + // 将innerNetObject对象的children都序列化为消息 this.WriteSpawnMessage(innerNetObject, innerNetObject.OwnerId, innerNetObject.SpawnFlags, messageWriter); } } @@ -1273,10 +1278,10 @@ namespace InnerNet return (int)(gameId[0] | (int)gameId[1] << 8 | (int)gameId[2] << 16 | (int)gameId[3] << 24); } + // 每隔MinSendInterval的时间同步一次标记为脏的数据 private void FixedUpdate() { - // 每隔MinSendInterval的时间同步一次标记为脏的数据 - if (this.mode == MatchMakerModes.None || this.Streams == null) + if (this.mode == MatchMakerModes.None || this.Streams == null) { this.timer = 0f; return; @@ -1300,8 +1305,9 @@ namespace InnerNet && innerNetObject.DirtyBits != 0U && (innerNetObject.AmOwner || (innerNetObject.OwnerId == /*-2*/InvalidClient && this.AmHost))) { + // MsgWrite:SyncNetObject MessageWriter messageWriter = this.Streams[(int)innerNetObject.sendMode]; // 根据是否是可靠UDP,选择对应的writer - messageWriter.StartMessage(1); + messageWriter.StartMessage(1); // 1=DataFlag messageWriter.WritePacked(innerNetObject.NetId); if (innerNetObject.Serialize(messageWriter, false)) { @@ -1356,6 +1362,8 @@ namespace InnerNet return default(T); } + // MsgWrite:Rpc 下面是有关Rpc的写入函数 + //c 发送RPC public void SendRpcImmediately(uint targetNetId, byte callId, SendOption option) { @@ -1392,6 +1400,7 @@ namespace InnerNet return messageWriter; } + // 立即发送Rpc public void FinishRpcImmediately(MessageWriter msg) { msg.EndMessage(); @@ -1407,6 +1416,7 @@ namespace InnerNet .EndMessage(); } + // 准备好Rpc通用数据,包含RpcFlag, netId和callId public MessageWriter StartRpc(uint targetNetId, byte callId, SendOption option = SendOption.Reliable) { MessageWriter messageWriter = this.Streams[(int)option]; // 拿到对应的发送流 @@ -1428,6 +1438,7 @@ namespace InnerNet base.StartCoroutine(this.CoSendSceneChange(sceneName)); } + // private IEnumerator CoSendSceneChange(string sceneName) { List<InnerNetObject> obj = this.allObjects; @@ -1453,7 +1464,8 @@ namespace InnerNet { yield break; } - if (!this.AmHost && this.connection.State == ConnectionState.Connected) + // MsgWrite:SceneChange + if (!this.AmHost && this.connection.State == ConnectionState.Connected)//如果是非主机玩家,广播加载完场景的消息 { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); messageWriter.StartMessage(5); @@ -1500,19 +1512,21 @@ namespace InnerNet Debug.LogError("Tried to spawn while not host:" + netObjParent); } + // 将netObjParent下的所有InnerNetObject类型都序列化为消息,后续会广播给其他玩家 + // MsgWrite:SpawnMsg private void WriteSpawnMessage(InnerNetObject netObjParent, int ownerId, SpawnFlags flags, MessageWriter msg) { - msg.StartMessage(4); - msg.WritePacked(netObjParent.SpawnId); - msg.WritePacked(ownerId); - msg.Write((byte)flags); + msg.StartMessage(4); // 4 = SpawnFlag + msg.WritePacked(netObjParent.SpawnId); // spawnId用来指代某个派生类的类型 + msg.WritePacked(ownerId); // ownerId是对应玩家的clientId + msg.Write((byte)flags); // flags有两种,none 和 IsClientCharacter InnerNetObject[] componentsInChildren = netObjParent.GetComponentsInChildren<InnerNetObject>(); msg.WritePacked(componentsInChildren.Length); foreach (InnerNetObject innerNetObject in componentsInChildren) { innerNetObject.OwnerId = ownerId; innerNetObject.SpawnFlags = flags; - if (innerNetObject.NetId == 0U) + if (innerNetObject.NetId == 0U) // 如果没有netId,分配一个新的 { InnerNetObject innerNetObject2 = innerNetObject; uint netIdCnt = this.NetIdCnt; @@ -1522,13 +1536,14 @@ namespace InnerNet this.allObjectsFast.Add(innerNetObject.NetId, innerNetObject); } msg.WritePacked(innerNetObject.NetId); - msg.StartMessage(1); + msg.StartMessage(1); // 1=DataFlag innerNetObject.Serialize(msg, true); msg.EndMessage(); } msg.EndMessage(); } + // MsgWrite:DespawnMsg public void Despawn(InnerNetObject objToDespawn) { if (objToDespawn.NetId < 1U) @@ -1537,7 +1552,7 @@ namespace InnerNet return; } MessageWriter messageWriter = this.Streams[1]; - messageWriter.StartMessage(5); + messageWriter.StartMessage(5); // DespawnFlag messageWriter.WritePacked(objToDespawn.NetId); messageWriter.EndMessage(); this.RemoveNetObject(objToDespawn); @@ -1646,23 +1661,23 @@ namespace InnerNet { switch (reader.Tag) { - case (int)SubTagAlias.Normal: + case DataFlag: // MsgRead:SyncNetObject 隔一段时间同步一次netObject的数据 { - uint num = reader.ReadPackedUInt32(); + uint netId = reader.ReadPackedUInt32(); InnerNetObject innerNetObject; - if (this.allObjectsFast.TryGetValue(num, out innerNetObject)) + if (this.allObjectsFast.TryGetValue(netId, out innerNetObject)) { innerNetObject.Deserialize(reader, false); return; } - if (!this.DestroyedObjects.Contains(num)) + if (!this.DestroyedObjects.Contains(netId)) { - this.DeferMessage(cnt, reader, "Stored data for " + num); + this.DeferMessage(cnt, reader, "Stored data for " + netId); return; } return; } - case (int)SubTagAlias.Rpc: + case RpcFlag: // MsgRead:Rpc , Rpc调用,别的机器发过来的Rpc调用,发给对应的innnerNetObject调用 { // 根据编号找到对应的同步数据 uint netId = reader.ReadPackedUInt32(); @@ -1681,72 +1696,73 @@ namespace InnerNet } return; } - case (int)SubTagAlias.SpawnCharacter: + case SpawnFlag: // MsgRead:SpawnMsg ,收到spawn消息后,实例化这个对象并设置netObjects的参数 { - uint num3 = reader.ReadPackedUInt32(); - if ((ulong)num3 >= (ulong)((long)this.SpawnableObjects.Length)) + uint spawnId = reader.ReadPackedUInt32(); + if ((ulong)spawnId >= (ulong)((long)this.SpawnableObjects.Length)) { - Debug.LogError("Couldn't find spawnable prefab: " + num3); + Debug.LogError("Couldn't find spawnable prefab: " + spawnId); return; } - int num4 = reader.ReadPackedInt32(); - ClientData clientData = this.FindClientById(num4); - if (num4 > 0 && clientData == null) + int clientId = reader.ReadPackedInt32(); + ClientData clientData = this.FindClientById(clientId); + if (clientId > 0 && clientData == null) { - this.DeferMessage(cnt, reader, "Delay spawn for unowned " + num3); + this.DeferMessage(cnt, reader, "Delay spawn for unowned " + spawnId); return; } // 创建角色对象并设置参数 - InnerNetObject innerNetObject3 = UnityEngine.Object.Instantiate<InnerNetObject>(this.SpawnableObjects[(int)num3]); - innerNetObject3.SpawnFlags = (SpawnFlags)reader.ReadByte(); - if ((innerNetObject3.SpawnFlags & SpawnFlags.IsClientCharacter) != SpawnFlags.None) + // parentNetObject是父物体 + InnerNetObject parentNetObject = UnityEngine.Object.Instantiate<InnerNetObject>(this.SpawnableObjects[(int)spawnId]); + parentNetObject.SpawnFlags = (SpawnFlags)reader.ReadByte(); + if ((parentNetObject.SpawnFlags & SpawnFlags.IsClientCharacter) != SpawnFlags.None) // 如果是角色的话,parentNetObject一定是playerControl { if (!clientData.Character) { clientData.InScene = true; - clientData.Character = (innerNetObject3 as PlayerControl); + clientData.Character = (parentNetObject as PlayerControl); } - else if (innerNetObject3) + else if (parentNetObject) { Debug.LogWarning(string.Format("Double spawn character: {0} already has {1}", clientData.Id, clientData.Character.NetId)); - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } } - int num5 = reader.ReadPackedInt32(); - InnerNetObject[] componentsInChildren = innerNetObject3.GetComponentsInChildren<InnerNetObject>(); - if (num5 != componentsInChildren.Length) + int numOfNetObjs = reader.ReadPackedInt32(); + InnerNetObject[] componentsInChildren = parentNetObject.GetComponentsInChildren<InnerNetObject>(); + if (numOfNetObjs != componentsInChildren.Length) { - Debug.LogError("Children didn't match for spawnable " + num3); - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + Debug.LogError("Children didn't match for spawnable " + spawnId); + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - for (int i = 0; i < num5; i++) + for (int i = 0; i < numOfNetObjs; i++) { - InnerNetObject innerNetObject4 = componentsInChildren[i]; - innerNetObject4.NetId = reader.ReadPackedUInt32(); // 设置netid - innerNetObject4.OwnerId = num4; - if (this.DestroyedObjects.Contains(innerNetObject4.NetId)) + InnerNetObject childNetObject = componentsInChildren[i]; + childNetObject.NetId = reader.ReadPackedUInt32(); + childNetObject.OwnerId = clientId; + if (this.DestroyedObjects.Contains(childNetObject.NetId)) // 如果这个netId已经被标记了销毁,表明这是一个错误的生成消息 { - innerNetObject3.NetId = uint.MaxValue; - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + parentNetObject.NetId = uint.MaxValue; + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - if (!this.AddNetObject(innerNetObject4)) + if (!this.AddNetObject(childNetObject)) { - innerNetObject3.NetId = uint.MaxValue; - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + parentNetObject.NetId = uint.MaxValue; + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - MessageReader messageReader = reader.ReadMessage(); + MessageReader messageReader = reader.ReadMessage(); // netObject的序列化数据 if (messageReader.Length > 0) { - innerNetObject4.Deserialize(messageReader, true); + childNetObject.Deserialize(messageReader, true); // 反序列化重建出来结构 } } return; } - case (int)SubTagAlias.RemoveNetObjectByNetId: + case DespawnFlag: // MsgRead:DespawnMsg,收到消息后,销毁对应的netObject { uint netId = reader.ReadPackedUInt32(); this.DestroyedObjects.Add(netId); @@ -1754,14 +1770,14 @@ namespace InnerNet if (innerNetObject5) { this.RemoveNetObject(innerNetObject5); - UnityEngine.Object.Destroy(innerNetObject5.gameObject); + UnityEngine.Object.Destroy(innerNetObject5.gameObject); // 销毁 return; } return; } - case (int)SubTagAlias.ChangeScene: + case SceneChangeFlag: // MsgRead:SceneChange , 收到某个玩家加载完成场景的消息 { - int id = reader.ReadPackedInt32(); + int id = reader.ReadPackedInt32(); // clientId ClientData client = this.FindClientById(id); // 找到对应的玩家 string targetScene = reader.ReadString(); if (client != null && !string.IsNullOrWhiteSpace(targetScene)) @@ -1781,7 +1797,7 @@ namespace InnerNet Debug.Log(string.Format("Couldn't find client {0} to change scene to {1}", id, targetScene)); return; } - case (int)SubTagAlias.PlayerReady: + case ReadyFlag: // MsgRead:PlayerReady , 某个玩家已经准备好了 { ClientData clientData2 = this.FindClientById(reader.ReadPackedInt32()); if (clientData2 != null) @@ -1803,7 +1819,7 @@ namespace InnerNet }) + string.Join<byte>(" ", reader.Buffer)); } - // 延迟发送消息 + // 延迟到下一帧调用回调? private void DeferMessage(int cnt, MessageReader reader, string logMsg) { if (cnt > 10) |