예제 #1
0
    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);
    }
예제 #2
0
        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);
        }