void SetCautionAlarm(StateController controller)
    {
        Alarm alarm = controller.transform.GetComponent <Alarm>();

        if (alarm != null)
        {
            alarm.alarmPhase = Alarm.AlarmPhase.Caution;
            alarm.ChangeAlarmRadiusColour();
        }
    }
    IEnumerator SoundAlarm(StateController controller)
    {
        controller.bHasStatedAction = true;
        float alarmAgainTIme = 0.2f;
        Alarm alarm          = controller.GetComponent <Alarm>();

        if (alarm != null)
        {
            alarm.alarmPhase = Alarm.AlarmPhase.Alarming;
            alarm.ChangeAlarmRadiusColour();

            controller.onExitState += alarm.ChangeAlarmRadiusColour;

            while (controller.bHasStatedAction)
            {
                Collider2D[] objectsInAlarmSoundRadius = Physics2D.OverlapCircleAll(controller.transform.position, alarm.sensorDectecionRadius, alarm.objectsToAlertMask);
                for (int i = 0; i < objectsInAlarmSoundRadius.Length; ++i)
                {
                    IReactable reactableObject = objectsInAlarmSoundRadius[i].GetComponent <IReactable>();
                    if (reactableObject != null)
                    {
                        //TODO add a raycast around here to limit distance or area that reactable object can me manipulated.
                        if (controller.fov.visableTagets.Count > 0)
                        {
                            Transform firstDetectedObject = controller.fov.visableTagets[0];
                            reactableObject.React(Reactor.ReactorType.Alarm, alarm.reactionPriorityValue, firstDetectedObject, controller.transform);
                        }
                    }
                    else
                    {
                        Debug.Log("IReactable = null on object : " + objectsInAlarmSoundRadius[i].gameObject.name);
                    }
                }

                yield return(new WaitForSeconds(alarmAgainTIme));
            }
        }
    }