public override void ComponentStart()
        {
            if (!UnityUtils.Exists(bulletPrefab))
            {
                Debug.LogWarning($"No bullet prefab specified for {gameObject.name}!");
            }

            if (!Positions.Any())
            {
                Debug.LogError($"Enemy shooter named '{gameObject.name}' doesn't have any predefined positions and his behavior will not work right.");
            }

            var brain = GetRequiredComponent <HumanoidNPCBrainComponent>();

            if (!UnityUtils.Exists(brain))
            {
                throw new UnityException($"Unable to find a HumanoidNPCBrain on {gameObject.name}");
            }

            brain.attackByPlayer.AddListener(OnAttackedByPlayer);
            brain.attackBegin.AddListener(OnAttackBegin);
            brain.attackEnd.AddListener(OnAttackEnd);
            brain.damageEnable.AddListener(OnDamageEnable);
            brain.damageDisable.AddListener(OnDamageDisable);

            var brainTimerPrefabTemp = new GameObject();

            brainTimerPrefabTemp.AddComponent <IntervalTimerComponent>();
            var inst = Instantiate(brainTimerPrefabTemp, transform);

            inst.name = "BrainTimer";

            brainTimer       = GetRequiredComponent <IntervalTimerComponent>(inst);
            brainTimer.Label = "BrainTimerComponent";
            brainTimer.SetInterval((int)UnityEngine.Random.Range(thinkTimeMin, thinkTimeMax));
            brainTimer.SelfDestruct = false;
            brainTimer.Randomize    = false;
            brainTimer.AutoReset    = true;
            brainTimer.OnIntervalReached.AddListener(BrainUpdate);

            shooterAnimator = GetRequiredComponent <ShooterSkeletonAnimatorComponent>();

            if (!UnityUtils.Exists(shooterAnimator))
            {
                throw new UnityException($" {gameObject.name} requires a shooter skeleton animator and you don't have that.");
            }

            Destroy(brainTimerPrefabTemp);

            currentSeekedPosition = FindNearestShooterPosition();

            base.ComponentStart();
        }
        // Called from the interval timer
        private void BrainUpdate()
        {
            if (isActiveAndEnabled)
            {
                // if we're at our position, fire a bullet towards the player
                if (IsNearEnoughToPosition())
                {
                    Attack();
                }

                // Additionally, if the player is in our area, pick a new position
                if (player.transform.position.x.IsWithin(currentSeekedPosition.Range, currentSeekedPosition.Position.x))
                {
                    currentSeekedPosition = FindSecondNearestShooterPositionAwayFromPosition(player.transform.position.x);
                }

                brainTimer.SetInterval((int)UnityEngine.Random.Range(thinkTimeMin, thinkTimeMax));
            }
        }