/*
     * Handle entered enermy
     */
    private PandaMove OnEnermyEnter(GameObject gameObject)
    {
        PandaMove pandaMove = null;

        // Lock target if target was null or target changed
        if (targetLocked == null || targetLocked != gameObject)
        {
            if (targetLocked != null)
            {
                // Unlock
                PandaMove lastPandaMove = targetLocked.GetComponent <PandaMove>();
                if (lastPandaMove != null)
                {
                    lastPandaMove.Unlock();
                }
            }

            targetLocked = gameObject;
            pandaMove    = gameObject.GetComponent <PandaMove>();
            if (pandaMove != null)
            {
                if (midiPlayer)
                {
                    midiPlayer.AddNote(new SingleNote(baseNote + pandaMove.index, 0.5f));
                }

                pandaMove.Lock();
            }
        }

        return(pandaMove);
    }
    void Update()
    {
        // Timer count
        timer -= Time.deltaTime;
        if (timer <= 0)
        {
            GameObject pandaInstance = Instantiate(panda, departure.transform.position, Quaternion.identity);

            PandaMove pandaMove = pandaInstance.GetComponent <PandaMove>();

            if (pandaMove != null)
            {
                pandaInstance.GetComponent <PandaMove>().target = destination;
                pandaInstance.GetComponent <PandaMove>().index  = Configuration.availablePanda[Random.Range(0, Configuration.availablePanda.Count)];
            }
            timer = Random.Range(minGenerateInterval, maxGenerateInterval);
        }
    }
    /*
     * Keyboard/Mouse Control detector
     */
    private void Control()
    {
        // Teleport
        if (Input.GetKeyUp(KeyCode.T))
        {
            if (teleport)
            {
                teleport.SwitchPosition();
            }
        }

        // Get raycast object
        GameObject gameObject = GetRaycastedObject(currentCamera);

        if (gameObject != null)
        {
            if (gameObject.CompareTag("Enermy"))
            {
                OnEnermyEnter(gameObject);
            }
            else if (targetLocked != null && targetLocked.CompareTag("Enermy"))
            {
                PandaMove lastPandaMove = targetLocked.GetComponent <PandaMove>();
                if (lastPandaMove != null)
                {
                    lastPandaMove.Unlock();
                }

                targetLocked = null;
            }

            if (Input.GetMouseButtonUp(0) && gameObject.CompareTag("MagicBall"))
            {
                OnBallPlayed(gameObject);
            }

            if (Input.GetMouseButton(1) && gameObject.CompareTag("MagicBall"))
            {
                OnBallGet(gameObject, currentCamera);
            }
        }
        else if (targetLocked != null && targetLocked.CompareTag("Enermy"))
        {
            PandaMove lastPandaMove = targetLocked.GetComponent <PandaMove>();
            if (lastPandaMove != null)
            {
                lastPandaMove.Unlock();
            }

            targetLocked = null;
        }

        // Launch projectile
        if (Input.GetMouseButtonUp(0))
        {
            LaunchProjectile(currentCamera);
        }

        // Middle Click, show balls
        if (Input.GetMouseButtonUp(2))
        {
            if (magicBallGenerator)
            {
                if (isBallShowed)
                {
                    magicBallGenerator.HideMagicBall();
                    isBallShowed = false;
                }
                else
                {
                    magicBallGenerator.ShowMagicBall();
                    isBallShowed = true;
                }
            }
        }
    }
    /*
     * VR Control listener
     */
    private void VRControl()
    {
        // Teleport - Right Hand Grip pressed
        if (ViveInput.GetPressUp(HandRole.RightHand, ControllerButton.Grip))
        {
            if (teleport)
            {
                teleport.SwitchPosition();
            }
        }

        // Get raycast object of MainCamera
        GameObject gameObject = GetRaycastedObject(currentCamera);

        if (gameObject != null)
        {
            if (gameObject.CompareTag("Enermy"))
            {
                OnEnermyEnter(gameObject);
            }
            else if (targetLocked != null && targetLocked.CompareTag("Enermy"))
            {
                PandaMove lastPandaMove = targetLocked.GetComponent <PandaMove>();
                if (lastPandaMove != null)
                {
                    lastPandaMove.Unlock();
                }

                targetLocked = null;
            }
        }
        else if (targetLocked != null && targetLocked.CompareTag("Enermy"))
        {
            PandaMove lastPandaMove = targetLocked.GetComponent <PandaMove>();
            if (lastPandaMove != null)
            {
                lastPandaMove.Unlock();
            }

            targetLocked = null;
        }

        // Left hand play note of ball
        gameObject = GetRaycastedObject(leftManette);
        if (gameObject != null)
        {
            Animator leftAnimator = leftManette.GetComponentInChildren <Animator>();

            if (leftAnimator != null)
            {
                // Lighten magic effects
                // We can also use setActive of sub components, but this is for practicing animator
                leftAnimator.SetBool("IsHalt", false);
                leftAnimator.SetBool("IsAttracting", true);
            }

            if (ViveInput.GetPadPressVector(HandRole.LeftHand) != Vector2.zero && gameObject.CompareTag("MagicBall"))
            {
                OnBallPlayed(gameObject);

                ViveInput.TriggerHapticPulse(HandRole.LeftHand, 500);
            }

            if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.Trigger) && gameObject.CompareTag("MagicBall"))
            {
                if (OnBallGet(gameObject, leftManette) != null)
                {
                    Animator rightAnimator = rightManette.GetComponentInChildren <Animator>();
                    if (rightAnimator != null)
                    {
                        // Light magic effects
                        rightAnimator.SetBool("IsLaunched", false);
                        rightAnimator.SetBool("IsCharged", true);
                    }
                }
            }
        }
        else
        {
            // Need test
            Animator leftAnimator = leftManette.GetComponentInChildren <Animator>();
            if (leftAnimator != null)
            {
                // Close magic effects
                leftAnimator.SetBool("IsHalt", true);
                leftAnimator.SetBool("IsAttracting", false);
            }
        }

        // Launch projectile
        if (ViveInput.GetPressDown(HandRole.RightHand, ControllerButton.Trigger))
        {
            LaunchProjectile(rightManette);

            Animator rightAnimator = rightManette.GetComponentInChildren <Animator>();
            if (rightAnimator != null)
            {
                // Close magic effects
                rightAnimator.SetBool("IsLaunched", true);
                rightAnimator.SetBool("IsCharged", false);
            }

            ViveInput.TriggerHapticPulse(HandRole.RightHand, 500);
        }

        // Right touch pad, play current note
        if (ViveInput.GetPadPressVector(HandRole.RightHand) != Vector2.zero)
        {
            if (chargedIndex != -1)
            {
                if (midiPlayer)
                {
                    midiPlayer.AddNote(new SingleNote(baseNote + chargedIndex, 0.5f));
                }
                ViveInput.TriggerHapticPulse(HandRole.RightHand, 500);
            }
        }

        // Left grib, show balls
        if (ViveInput.GetPressUp(HandRole.LeftHand, ControllerButton.Grip))
        {
            if (magicBallGenerator)
            {
                if (isBallShowed)
                {
                    magicBallGenerator.HideMagicBall();
                    isBallShowed = false;
                }
                else
                {
                    magicBallGenerator.ShowMagicBall();
                    isBallShowed = true;
                }
            }
        }
    }