public static void SendPacketsSafely(P2PPackage data, bool IncludeSelf = true) { var ms = new MemoryStream(); new BinaryFormatter().Serialize(ms, data); SendPacketsToAll(ms.GetBuffer(), EP2PSend.k_EP2PSendReliable, IncludeSelf); }
public static void SendPackets(P2PPackage data, EP2PSend send, bool IncludeSelf = true) { //SendUnreliable – 小包,可以丢失,不需要依次发送,但要快 //SendUnreliableNoDelay – 跟上面一样,但是不做链接检查,因为这样,它可能被丢失,但是这种方式是最快的传送方式。 //SendReliable – 可靠的信息,大包,依次收发。 //SendReliableWithBuffering – 跟上面一样,但是在发送前会缓冲数据,如果你发送大量的小包,它不会那么及时。(可能会延迟200ms) var ms = new MemoryStream(); new BinaryFormatter().Serialize(ms, data); SendPacketsToAll(ms.GetBuffer(), send, IncludeSelf); }
// Analyze the P2Ppackage public virtual void Analyze(P2PPackage package, CSteamID steamid) { if (package.type != P2PPackageType.Instantiate) { if (package.Object_identity != -1) { while (instance.OnlineObjects.Count <= package.Object_identity) { instance.OnlineObjects.Add(null); } if (instance.OnlineObjects[package.Object_identity] == null) { var obj = Instantiate( NetworkLobbyManager.instance.SpawnablePrefab[package.ObjectSpawnID]); obj.TargetID = package.Object_identity; obj.host = steamid; obj.Init(); } } } switch (package.type) { case P2PPackageType.SyncTransform: instance.OnlineObjects[package.Object_identity].GetComponent <SynTransform>() .Receive(Lib.To_Vector3((Lib.M_Vector3)package.value)); break; case P2PPackageType.SeverClose: Debug.Log("服务器关闭"); DestroyConnections(true); break; case P2PPackageType.Instantiate: var info = (SpawnInfo)package.value; var obj = Instantiate( NetworkLobbyManager.instance.SpawnablePrefab[info.SpawnID], Lib.To_Vector3(info.pos), Lib.To_Quaternion(info.rot)); obj.TargetID = package.Object_identity; obj.host = steamid; obj.Init(); break; case P2PPackageType.Broadcast: if (NetworkLobbyManager.instance.lobby.m_SteamID == 0) { break; } //Debug.Log("从 "+SteamFriends.GetFriendPersonaName(steamid)+" 收到应答数据包"); if (!PlayerList.Contains(steamid)) { PlayerList.Add(steamid); CreateConnection(steamid); //PlayerNeedToConnect=new bool[PlayerList.Count]; //PlayerNeedToConnect[PlayerList.IndexOf(SelfID)] = true; } if (checking_joined) { var index = PlayerList.IndexOf(steamid); if (!player_need_to_connect[index]) { player_need_to_connect[index] = true; } } break; case P2PPackageType.SendMessage: var rpc_info = (SendMessageInfo)package.value; if (rpc_info.have_value) { instance.OnlineObjects[package.Object_identity].SendMessage(rpc_info.FuncName, rpc_info.Values); } else { instance.OnlineObjects[package.Object_identity].SendMessage(rpc_info.FuncName); } break; case P2PPackageType.Sync: var sync = instance.OnlineObjects[package.Object_identity].sync; if (sync != null) { sync.OnSync((object[])package.value); } break; case P2PPackageType.DeleteObject: if (instance.OnlineObjects[package.Object_identity] != null) { Destroy(instance.OnlineObjects[package.Object_identity].gameObject); } break; case P2PPackageType.LoadScene: SceneManager.LoadScene((string)package.value); break; case P2PPackageType.RPC: var callInfo = (RPCInfo)package.value; instance.OnlineObjects[package.Object_identity].rpc.Call(callInfo.FuncIndex, callInfo.Values); break; case P2PPackageType.Custom: var CustomPacket = (CustomPacket)package.value; instance.events.CustomPacket.Invoke(CustomPacket.tag, CustomPacket.value); break; case P2PPackageType.AnimatorState: instance.OnlineObjects[package.Object_identity].anim.SetAnimState((SteamAnimator.MyAniationMessage)package.value); break; case P2PPackageType.AnimatorParamter: instance.OnlineObjects[package.Object_identity].anim.SetParamter((SteamAnimator.MyAniationParamterMessage[])package.value); break; case P2PPackageType.LeftLobby: if (PlayerList.Contains(steamid)) { PlayerList.Remove(steamid); } foreach (var t in instance.OnlineObjects) { if (!t.DestoryOnQuit) { continue; } if (t.host == steamid) { Destroy(t.gameObject); } } break; default: { throw new ArgumentOutOfRangeException(); } } }