summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetClient.cs140
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)