protected override void OnUpdate()
    {
        if (GameManager.Instance == null || !GameManager.Instance.IsPlaying)
        {
            return;
        }

        job.Complete();
        while (detections.TryDequeue(out bool isInsideObstacle))
        {
            if (isInsideObstacle)
            {
                HealthManager.Instance.InsideObstacle();
                OnEnteredObstacle?.Invoke();
            }
        }
        detections.Clear();

        var newJob = new DetectionJob
        {
            CameraPosition        = Camera.main.transform.position,
            Output                = detections.AsParallelWriter(),
            WorldRenderBoundsType = GetComponentTypeHandle <WorldRenderBounds>(true)
        };

        job        = newJob.ScheduleParallel(obstacleQuery, Dependency);
        Dependency = JobHandle.CombineDependencies(Dependency, job);
    }
    protected override void OnUpdate()
    {
        if (registeredControllers.Count == 0)
        {
            return;
        }

        saberDatas.Clear();

        for (int i = 0; i < registeredControllers.Count; i++)
        {
            saberDatas.Add(new SaberData
            {
                AffectsNoteType = registeredControllers[i].affectsNoteType,
                Forward         = registeredControllers[i].transform.forward,
                Position        = registeredControllers[i].transform.position,
                Length          = registeredControllers[i].saberLength
            });
        }


        var newJob = new DetectionJob
        {
            SaberDatas            = saberDatas,
            RaycastOffsets        = raycastOffsets,
            HitDetections         = detections.AsParallelWriter(),
            NoteType              = GetComponentTypeHandle <Note>(true),
            TranslationType       = GetComponentTypeHandle <Translation>(true),
            RotationType          = GetComponentTypeHandle <Rotation>(true),
            WorldRenderBoundsType = GetComponentTypeHandle <WorldRenderBounds>(true),
            EntityType            = GetEntityTypeHandle(),
        };

        job        = newJob.ScheduleParallel(noteQuery, Dependency);
        Dependency = JobHandle.CombineDependencies(Dependency, job);

        job.Complete();
        while (detections.TryDequeue(out SaberNoteHitData hit))
        {
            for (int i = 0; i < registeredControllers.Count; i++)
            {
                if (registeredControllers[i].affectsNoteType == hit.Note.Type)
                {
                    registeredControllers[i].RegisterHit(hit);
                }
            }
        }
    }