//		public bool go = false;

        void Awake()
        {
            // Get the robot
            this.robot = GameObject.FindGameObjectWithTag(TagRobot);


            // Get the graspables
            this.graspables = GameObject.FindGameObjectsWithTag(TagGraspables).ToList <GameObject>();

            if (graspables.Count == 0)
            {
                throw new Exception("Count of Graspables is zero.");
            }

            // Check the name conflict of graspables.
            if (this.graspables.Count != (from graspable in this.graspables select graspable.name).Distinct().Count())
            {
                throw new Exception("There is the name conflict of graspable objects.");
            }

            SIGVerseLogger.Info("Count of Graspables = " + this.graspables.Count);


            // Get the destination candidates
            this.destinationCandidates = GameObject.FindGameObjectsWithTag(TagDestinationCandidates).ToList <GameObject>();

            if (this.destinationCandidates.Count == 0)
            {
                throw new Exception("Count of DestinationCandidates is zero.");
            }

            // Check the name conflict of destination candidates.
            if (this.destinationCandidates.Count != (from destinations in this.destinationCandidates select destinations.name).Distinct().Count())
            {
                throw new Exception("There is the name conflict of destination candidates objects.");
            }

            SIGVerseLogger.Info("Count of DestinationCandidates = " + this.destinationCandidates.Count);


            this.graspingTarget = this.graspables           [UnityEngine.Random.Range(0, this.graspables.Count)];
            this.destination    = this.destinationCandidates[UnityEngine.Random.Range(0, this.destinationCandidates.Count)];

            SIGVerseLogger.Info("Grasping target is " + graspingTarget.name);
            SIGVerseLogger.Info("Destination is " + destination.name);

            this.graspingTargetRigidbody = this.graspingTarget.GetComponentInChildren <Rigidbody>();

            this.avatarLeftHandController  = this.GetComponentsInChildren <CleanupAvatarHandController>().Where(item => item.handType == CleanupAvatarHandController.HandType.LeftHand).First();
            this.avatarRightHandController = this.GetComponentsInChildren <CleanupAvatarHandController>().Where(item => item.handType == CleanupAvatarHandController.HandType.RightHand).First();

            this.avatarHandController = this.avatarLeftHandController;             // Set default

            this.stepTimer = new StepTimer();
        }
        // Update is called once per frame
        void Update()
        {
            //if (this.go)
            //{
            //	this.receivedMessageMap[MsgPointIt] = true;

            //	this.go = false;
            //}

            if (this.receivedMessageMap[MsgTellMe])
            {
                StartCoroutine(this.SendMessage(this.taskMessage, 0.0f));

                this.receivedMessageMap[MsgTellMe] = false;
            }

            if (this.receivedMessageMap[MsgPointIt])
            {
                switch (this.pointingStep)
                {
                case PointingStep.PointTarget:
                {
                    if (UnityEngine.Random.Range(0, 2) == 0)
                    {
                        // Left Hand
                        this.avatarHandController = this.avatarLeftHandController;
                    }
                    else
                    {
                        // Right Hand
                        this.avatarHandController = this.avatarRightHandController;
                    }

                    this.avatarHandController.PointTarget(this.graspingTarget);

                    this.pointingStep++;
                    break;
                }

                case PointingStep.WaitForPointingTarget:
                {
                    if (this.avatarHandController.IsWaiting())
                    {
                        this.pointingStep++;
                    }

                    break;
                }

                case PointingStep.Stay1:
                {
                    if (this.stepTimer.IsTimePassed((int)this.pointingStep, 3000))
                    {
                        this.pointingStep++;
                    }
                    break;
                }

                case PointingStep.SpeechPickItUp:
                {
                    StartCoroutine(this.SendMessage(MsgPickItUp, 0.0f));
                    this.pointingStep++;

                    break;
                }

                case PointingStep.Stay2:
                {
                    if (this.stepTimer.IsTimePassed((int)this.pointingStep, 3000))
                    {
                        this.pointingStep++;
                    }
                    break;
                }

                case PointingStep.PointDestination:
                {
                    this.avatarHandController.PointDestination(this.destination);

                    this.pointingStep++;
                    break;
                }

                case PointingStep.WaitForPointingDestination:
                {
                    if (this.avatarHandController.IsWaiting())
                    {
                        this.pointingStep++;
                    }

                    break;
                }

                case PointingStep.Stay3:
                {
                    if (this.stepTimer.IsTimePassed((int)this.pointingStep, 3000))
                    {
                        this.pointingStep++;
                    }
                    break;
                }

                case PointingStep.SpeechCleanUp:
                {
                    StartCoroutine(this.SendMessage(MsgCleanUp, 0.0f));
                    this.pointingStep++;

                    break;
                }

                case PointingStep.Stay4:
                {
                    if (this.stepTimer.IsTimePassed((int)this.pointingStep, 3000))
                    {
                        this.pointingStep++;
                    }
                    break;
                }

                case PointingStep.Return:
                {
                    this.avatarHandController.Return();

                    this.pointingStep++;
                    break;
                }

                case PointingStep.WaitForReturn:
                {
                    if (this.avatarHandController.IsWaiting())
                    {
                        this.avatarHandController.Wait();

                        this.pointingStep = PointingStep.PointTarget;

                        this.receivedMessageMap[MsgPointIt] = false;
                    }
                    break;
                }
                }
            }
        }