private bool CastLine(Vector2 start, Vector2 end, Vector2 direction, float distance, float padding, ref RaycastHit2D closestHit, DebugData.DebugTag tag) { float closestHitDistance = distance + padding; bool hasHit = false; for (int i = 0; i < pointsPerLine; i++) { float ratio = i / (float)(pointsPerLine - 1); Vector2 position = Vector2.Lerp(start, end, ratio); RaycastHit2D[] hits = Physics2D.RaycastAll(position, direction, closestHitDistance, layerMask); foreach (var hit in hits) { // Ignore things we are moving away from. if (Vector2.Dot(hit.normal, direction) > Mathf.Epsilon) { continue; } if (hit.distance < closestHitDistance) { closestHitDistance = hit.distance; closestHit = hit; closestHit.distance = Mathf.Max(0.0f, closestHit.distance - padding); hasHit = true; } } data.Insert(tag, new DebugData.RaycastInfo() { start = position, end = position + direction * (hasHit ? closestHit.distance : closestHitDistance), }); } return(hasHit); }
public async Task TogglePlayAsync() { if (IsPlaying) { _cancelTasks.Cancel(); Status = Status.FileLoaded; return; } _cancelTasks = new CancellationTokenSource(); Status = Status.Playing; await Task.Run(async() => { var groupEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 20777); using (var udpSocket = new UdpClient()) { udpSocket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); for (; ReplayDataIndex < ReplayData.Count; ReplayDataIndex++) { if (_cancelTasks.Token.IsCancellationRequested) { break; } Thread.Sleep((60 / (int)ReplaySpeed)); foreach (BinaryPacket item in ReplayData[ReplayDataIndex]) { udpSocket.Send(item.Data, item.Data.Length, groupEP); if (Debug) { await Execute.OnUIThreadAsync(() => { DebugData.Insert(0, DebugModel.FromBinaryPacket(item)); }); } } ReplayDataIndex += ReplayData[ReplayDataIndex].Count(); } } }, _cancelTasks.Token); }