// Select an objet prefab with provided object category. Return a list of objects which will be randomly spawned in the scene. There can be at most 3 objects with OnFloor category,
    // including the target object.
    private NavObj[] SelectNavObj(NavObj.ObjCategory m_objCat)
    {
        // Only call this random selection function when autosettarget is true
        if (envSetup.autoSetTarget || agentController.CompletedEpisodes == 0)
        {
            // Randomly select 1-2 OnFloor Objects, 1-9 OnFurnitureTop Objects, 1-9 OnWall Objects (except for the target objects)
            // int OFObjNum = Random.Range(1,2);
            // int OFTObjNum = Random.Range(1,9);
            // int OWObjNum = Random.Range(1,9);
            objNums[0] = Random.Range(1, 2);
            objNums[1] = Random.Range(1, 9);
            objNums[2] = Random.Range(1, 9);

            // Create new object array which with be returned and contains all the objects
            selectedNavObjs = new NavObj[objNums.Sum() + 1];

            // Generate arrays with different categories
            NavObj[] OF_list  = objList.Where(obj => obj.objCat == NavObj.ObjCategory.OnFloor).ToArray();
            NavObj[] OFT_list = objList.Where(obj => obj.objCat == NavObj.ObjCategory.OnFurnitureTop).ToArray();
            NavObj[] OW_list  = objList.Where(obj => obj.objCat == NavObj.ObjCategory.OnWall).ToArray();

            // Select the target objects
            switch (m_objCat)
            {
            case NavObj.ObjCategory.OnFloor:
                selectedNavObjs[0] = OF_list[Random.Range(0, OF_list.Length)];
                break;

            case NavObj.ObjCategory.OnFurnitureTop:
                selectedNavObjs[0] = OFT_list[Random.Range(0, OFT_list.Length)];
                break;

            case NavObj.ObjCategory.OnWall:
                selectedNavObjs[0] = OW_list[Random.Range(0, OW_list.Length)];
                break;
            }

            // Set values for global object type and instance number variables
            objType        = selectedNavObjs[0].objType;
            objInstanceNum = selectedNavObjs[0].objInstanceNum;

            for (int i = 1; i < objNums.Sum() + 1; i++)
            {
                if (i < objNums[0] + 1) // Select OnFloor Objects
                {
                    selectedNavObjs[i] = OF_list[Random.Range(0, OF_list.Length)];
                }
                else if (i < objNums[0] + objNums[1] + 1)
                {
                    selectedNavObjs[i] = OFT_list[Random.Range(0, OFT_list.Length)];
                }
                else
                {
                    selectedNavObjs[i] = OW_list[Random.Range(0, OW_list.Length)];
                }
            }
            // return selectedNavObjs;
        }
        return(selectedNavObjs);
    }
    void LateUpdate()
    {
        if (envSetup.isTraining && agentCtrl.useBody)
        {
            kinectCtrl = kinectAnimator.runtimeAnimatorController as AnimatorController;
            leapCtrl   = leapAnimator.runtimeAnimatorController as AnimatorController;

            NavObj.ObjType currentType = GameObject.FindObjectOfType <AgentController>().CurrentObjType;
            string         objInfo     = $"The object type is {currentType.ToString()}";

            kinectClip = kinectCtrl.layers[0].stateMachine.defaultState.motion as AnimationClip;
            leapClip   = leapCtrl.layers[0].stateMachine.defaultState.motion as AnimationClip;
            string kinectInfo = $"The Kinect clip is {kinectClip.name}";
            string leapInfo   = $"The Leap clip is {leapClip.name}";

            displayArea.text = string.Join("\n", new string[] { objInfo, kinectInfo, leapInfo });
        }
    }