// SCENE GUI: -----------------------------------------------------------------------------

        private void OnSceneGUI()
        {
            Transform sight = PerceptronSight.GetEyes(this.perception);

            Handles.color = Color.white;
            Handles.DrawWireArc(
                sight.position,
                Vector3.up,
                perception.transform.forward,
                360f,
                this.perception.visionDistance
                );

            Handles.color = COLOR_SIGHT;
            Handles.DrawSolidArc(
                sight.position,
                Vector3.up,
                PerceptronBase.DirectionFromAngle(-this.perception.fieldOfView / 2.0f, this.perception.transform),
                this.perception.fieldOfView,
                this.perception.visionDistance
                );

            if (!Application.isPlaying)
            {
                return;
            }
            PerceptronBase perceptronSight = this.perception.GetPerceptron(Perception.Type.Sight);

            foreach (KeyValuePair <int, Tracker> item in perceptronSight.trackers)
            {
                Handles.color = item.Value.GetState() ? COLOR_SIGHT_ON : COLOR_SIGHT_OFF;
                Handles.DrawLine(
                    sight.position,
                    Tracker.CalculatePosition(item.Value)
                    );
            }
        }
        // EXECUTABLE: ----------------------------------------------------------------------------

        public override bool Check(GameObject target)
        {
            GameObject goObserver = this.observer.GetGameObject(target);
            GameObject goTarget   = this.target.GetGameObject(target);

            if (goObserver == null)
            {
                return(false);
            }
            if (goTarget == null)
            {
                return(false);
            }

            Perception senses = goObserver.GetComponentInChildren <Perception>();

            if (senses == null)
            {
                return(false);
            }

            PerceptronSight sight = senses.GetPerceptron(Perception.Type.Sight) as PerceptronSight;

            if (sight == null)
            {
                return(false);
            }

            switch (this.condition)
            {
            case Condition.CanSee: return(sight.CanSee(goTarget));

            case Condition.CanNotSee: return(!sight.CanSee(goTarget));

            default: return(false);
            }
        }
        // INITIALIZERS: --------------------------------------------------------------------------

        public override void Awake(Perception perception)
        {
            base.Awake(perception);
            this.eyes = PerceptronSight.GetEyes(perception);
        }