private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            BoostTimer.Instance.ActiveBoost(BoostType.SheepSpeedUp);
            BoostSpeedOnce();
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            BoostTimer.Instance.ActiveBoost(BoostType.x2SheepValue);
        }
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            BoostTimer.Instance.ActiveBoost(BoostType.SuperBox);
        }
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            BoostTimer.Instance.ActiveBoost(BoostType.AutoMerge);
        }

        if (isOnCutScene)
        {
            if (camCart.m_Position == camPath.PathLength && camTarget.gameObject.activeSelf)
            {
                camTarget.gameObject.SetActive(false);
                camOverrall.gameObject.SetActive(true);
                DOVirtual.DelayedCall(2f, () =>
                {
                    //camOverrall.gameObject.SetActive(false);
                    Destroy(camTarget.gameObject);
                    Destroy(camOverrall.gameObject);
                    Destroy(camCart.transform.parent.gameObject);

                    Destroy(mainCam.GetComponent <Cinemachine.CinemachineBrain>());
                    cameraHandler.enabled           = true;
                    isOnCutScene                    = false;
                    SheepController sheepController = SheepFactory.Instance.CreateNewSheep(1);
                    GameController.Instance.PutSheepBackToCage(sheepController);
                    SimpleResourcesManager.Instance.ShowParticle("MergeFx", sheepController.transform.position, 1);
                });
            }
        }
        else
        {
            if (BoostTimer.Instance.IsAutoMerge)
            {
                AutoMergeSheep();
            }
            //Mouse down
            if (Input.GetMouseButtonDown(0))
            {
                Ray        camRay = mainCam.ScreenPointToRay(Input.mousePosition);
                RaycastHit rayHit;

                int farmerLayer = LayerMask.GetMask("Farmer");
                int sheepLayer  = LayerMask.GetMask("Sheep");
                if (Physics.Raycast(camRay, out rayHit, float.MaxValue, farmerLayer))
                {
                    farmer.Waving();
                    BoostSpeedOnce();
                }
                else if (Physics.Raycast(camRay, out rayHit, float.MaxValue, sheepLayer))
                {
                    SheepController sheepController = rayHit.collider.GetComponent <SheepController>();
                    if (sheepController.SheepStateProp == SheepController.SheepState.Idle)
                    {
                        pickingSheep = sheepController;
                        var pos = lastPickingPos = pickingSheep.transform.position;
                        pos.y += 0.5f;
                        pickingSheep.transform.position = pos;
                        cameraHandler.enabled           = false;
                        pickingSheep.SetIsPickingUp(true);
                        moveOutTrigger.gameObject.SetActive(true);
                    }
                    else if (sheepController.SheepStateProp == SheepController.SheepState.Running)
                    {
                        if (!this.IsCageFull())
                        {
                            PutSheepBackToCage(sheepController);
                        }
                        else
                        {
                            //TODO: Show TextNofity
                        }
                    }

                    //MarkCanMergeSheep(pickingSheep);
                }
            }
            else if (Input.GetMouseButton(0)) //Mouse move
            {
                if (pickingSheep != null)
                {
                    float      currentHeight = pickingSheep.transform.position.y;
                    Ray        camRay        = GameController.Instance.mainCam.ScreenPointToRay(Input.mousePosition);
                    RaycastHit rayHit;
                    int        groundLayer = LayerMask.GetMask("Island");
                    if (Physics.Raycast(camRay, out rayHit, float.MaxValue, groundLayer))
                    {
                        Vector3 mouseWorldPos = rayHit.point;
                        mouseWorldPos.y = currentHeight;
                        pickingSheep.transform.position = mouseWorldPos;
                    }


                    int sheepLayer = LayerMask.GetMask("Sheep");
                    if (Physics.Raycast(camRay, out rayHit, float.MaxValue, sheepLayer))
                    {
                        SheepController selectSheep = rayHit.collider.GetComponent <SheepController>();
                        if (lastCanMergeSheep != null && lastCanMergeSheep != selectSheep)
                        {
                            lastCanMergeSheep.SetCanMerge(false);
                        }
                        if (selectSheep.SheepStateProp == SheepController.SheepState.Idle && selectSheep.SheepType == pickingSheep.SheepType)
                        {
                            selectSheep.SetCanMerge(true);
                        }
                        lastCanMergeSheep = selectSheep;
                    }
                    else
                    {
                        if (lastCanMergeSheep != null)
                        {
                            lastCanMergeSheep.SetCanMerge(false);
                        }
                    }
                }
            }
            else if (Input.GetMouseButtonUp(0))
            {
                if (pickingSheep != null)
                {
                    Ray        camRay = GameController.Instance.mainCam.ScreenPointToRay(Input.mousePosition);
                    RaycastHit rayHit;
                    int        sheepLayer = LayerMask.GetMask("Sheep");

                    int roadLayer = LayerMask.GetMask("Road");

                    int islandLayer = LayerMask.GetMask("Island");

                    int groundLayer = LayerMask.GetMask("Ground");

                    bool hitSheep = Physics.Raycast(camRay, out rayHit, float.MaxValue, sheepLayer);

                    if (hitSheep && rayHit.collider.GetComponent <SheepController>().SheepStateProp == SheepController.SheepState.Idle)
                    {
                        SheepController selectSheep = rayHit.collider.GetComponent <SheepController>();
                        if (selectSheep.SheepType < numOfSheepType && selectSheep.SheepStateProp == SheepController.SheepState.Idle && selectSheep.SheepType == pickingSheep.SheepType)
                        {
                            //DoMerge();
                            DoMerge(pickingSheep, selectSheep);
                        }
                        else
                        {
                            var pos = pickingSheep.transform.position;
                            pos.y -= 0.5f;
                            pickingSheep.transform.position = pos;
                        }
                    }
                    else if (Physics.Raycast(camRay, out rayHit, float.MaxValue, groundLayer))
                    {
                        var pos = pickingSheep.transform.position;
                        pos.y -= 0.5f;
                        pickingSheep.transform.position = pos;
                    }
                    else if (Physics.Raycast(camRay, out rayHit, float.MaxValue, islandLayer))
                    {
                        pickingSheep.transform.position = lastPickingPos;
                        OpenGateLeaveSheepOut(pickingSheep);
                    }

                    pickingSheep.SetIsPickingUp(false);
                    pickingSheep          = null;
                    lastCanMergeSheep     = null;
                    cameraHandler.enabled = true;
                    moveOutTrigger.gameObject.SetActive(false);
                }
            }
        }
    }