/// <summary> /// まとめたパケット送信など、最後に行うべきUpdateループ /// </summary> public override void OnLastUpdate() { if (state == State.Offline) { return; } if (!networkLinkerHandle.IsCreated) { return; } var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); if (state == State.Online || state == State.Disconnecting) { linker.SendMeasureLatencyPacket(); linker.SendReliableChunks(); } jobHandle = linker.ScheduleSendUnreliableChunks(default(JobHandle)); jobHandle = driver.ScheduleUpdate(jobHandle); jobHandle = linker.ScheduleRecieve(jobHandle); }
public override ushort Send(NativeList <ushort> playerIdList, DataStreamWriter data, QosType qos, bool noChunk = false) { if (state == State.Offline) { Debug.LogError("Send Failed : State.Offline"); return(0); } ushort seqNum = 0; using (var writer = CreateSendPacket(data, qos, playerIdList, playerId)) { if (networkLinkerHandle.IsCreated) { NetworkLinker linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); if (linker != null) { seqNum = linker.Send(writer, qos, noChunk); } } else { Debug.LogError("Send Failed : is not create networkLinker"); } } return(seqNum); }
//再接続 private void Reconnect() { var endpoint = new IPEndPoint(serverAdress, serverPort); state = State.Connecting; var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); linker.Reconnect(driver.Connect(endpoint)); Debug.Log("Reconnect"); }
/// <summary> /// 受信パケットの受け取りなど、最初に行うべきUpdateループ /// </summary> public override void OnFirstUpdate() { jobHandle.Complete(); if (!networkLinkerHandle.IsCreated) { return; } var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); linker.Complete(); if (state == State.Offline) { return; } //受け取ったパケットを処理に投げる. if (!networkLinkerHandle.IsCreated) { return; } if (linker.IsConnected) { Debug.Log("IsConnected : dataLen=" + linker.dataStreams.Length); } if (linker.IsDisconnected) { Debug.Log("IsDisconnected"); if (state == State.Disconnecting) { StopComplete(); } else { Reconnect(); } return; } for (int j = 0; j < linker.dataStreams.Length; j++) { var stream = linker.dataStreams[j]; var ctx = default(DataStreamReader.Context); if (!ReadQosHeader(stream, ref ctx, out var qosType, out var seqNum, out var ackNum)) { continue; } //chunkをバラして解析 while (true) { if (!ReadChunkHeader(stream, ref ctx, out var chunk, out var ctx2, out ushort targetPlayerId, out ushort senderPlayerId)) { break; } //Debug.Log ("Linker streamLen=" + stream.Length + ", Pos=" + pos + ", chunkLen=" + chunk.Length + ",type=" + type + ",target=" + targetPlayerId + ",sender=" + senderPlayerId); byte type = chunk.ReadByte(ref ctx2); //自分宛パケットの解析 switch (type) { case (byte)BuiltInPacket.Type.RegisterPlayer: state = State.Online; playerId = chunk.ReadUShort(ref ctx2); leaderStatTime = chunk.ReadLong(ref ctx2); ushort syncSelfSeqNum = chunk.ReadUShort(ref ctx2); if (syncSelfSeqNum != 0) { Debug.Log("Reconnected"); } linker.SyncSeqNum(syncSelfSeqNum); byte count = chunk.ReadByte(ref ctx2); for (int i = 0; i < count; i++) { activePlayerIdList.Add(chunk.ReadByte(ref ctx2)); } for (int i = 0; i < uncheckRegisterPlayerIds.Length; i++) { RegisterPlayerId(uncheckRegisterPlayerIds[i]); } for (int i = 0; i < uncheckUnregisterPlayerIds.Length; i++) { UnregisterPlayerId(uncheckUnregisterPlayerIds[i]); } uncheckRegisterPlayerIds.Clear(); uncheckUnregisterPlayerIds.Clear(); break; case (byte)BuiltInPacket.Type.NotifyAddPlayer: ushort addPlayerId = chunk.ReadUShort(ref ctx2); if (state == State.Online) { if (addPlayerId != playerId) { RegisterPlayerId(addPlayerId); ExecOnRegisterPlayer(addPlayerId); } } else { //ほかの接続情報が順番入れ替わっている可能性を考慮 uncheckRegisterPlayerIds.Add(addPlayerId); Debug.Log("uncheckRegisterPlayerIds.Add"); } Debug.Log("NotifyAddPlayer id=" + addPlayerId); break; case (byte)BuiltInPacket.Type.NotifyRemovePlayer: ushort removePlayerId = chunk.ReadUShort(ref ctx2); if (state == State.Online) { if (removePlayerId != playerId) { UnregisterPlayerId(removePlayerId); ExecOnUnregisterPlayer(removePlayerId); } } else { //ほかの接続情報が順番入れ替わっている可能性を考慮して uncheckUnregisterPlayerIds.Add(removePlayerId); Debug.Log("uncheckUnregisterPlayerIds.Add"); } Debug.Log("NotifyRemovePlayer id=" + removePlayerId); break; case (byte)BuiltInPacket.Type.StopNetwork: Stop(); break; default: RecieveData(senderPlayerId, type, chunk, ctx2); break; } } } }