public void SetTarget(GameObject target)
        {
            this.target = target;
            selected    = -1;
            if (target == null)
            {
                return;
            }

            Animator animator = target.GetComponent(typeof(Animator)) as Animator;

            if (animator == null)
            {
                return;
            }

            avatar = animator.avatar;
            if (avatar == null || !avatar.isValid || !avatar.isHuman)
            {
                return;
            }

            muscleMinMaxValues = PSMuscleDefine.GetMuscleMinMaxValues();

            Array boneArray = Enum.GetValues(typeof(HumanBodyBones));

            Array.Sort(boneArray);

            boneInfos = new BoneInfo[HumanTrait.BoneCount];

            for (int i = 0; i < HumanTrait.BoneCount; i++)
            {
                BoneInfo info = new BoneInfo();
                info.bone          = animator.GetBoneTransform((HumanBodyBones)boneArray.GetValue(i));
                info.humanBoneName = HumanTrait.BoneName [i];
                info.boneId        = i;

                info.muscleXId = HumanTrait.MuscleFromBone(info.boneId, 0);
                info.muscleYId = HumanTrait.MuscleFromBone(info.boneId, 1);
                info.muscleZId = HumanTrait.MuscleFromBone(info.boneId, 2);
                if (info.muscleXId != -1 || info.muscleYId != -1 || info.muscleZId != -1)
                {
                    boneInfos [i] = info;
                }
            }

            // get avatar methods
            getAxisLength   = avatar.GetType().GetMethod("GetAxisLength", flags);
            getPreRotation  = avatar.GetType().GetMethod("GetPreRotation", flags);
            getPostRotation = avatar.GetType().GetMethod("GetPostRotation", flags);
            getZYRoll       = avatar.GetType().GetMethod("GetZYRoll", flags);
            getLimitSign    = avatar.GetType().GetMethod("GetLimitSign", flags);
            getZYPostQ      = avatar.GetType().GetMethod("GetZYPostQ", flags);
        }
        public void Init()
        {
            int len = PSMuscleDefine.muscle.Length;

            this.muscleBodyGroupToggle = new bool[len];
            for (int i = 0; i < len; i++)
            {
                this.muscleBodyGroupToggle [i] = false;
            }
            this.muscleName = PSMuscleDefine.GetMuscleName();

            this.propertyMuscleName = PSMuscleDefine.GetPropertyMuscleName();

            this.muscleCount  = HumanTrait.MuscleCount;
            this.muscleToggle = new bool[this.muscleCount];
            this.muscleValue  = new float[this.muscleCount];
            for (int k = 0; k < this.muscleCount; k++)
            {
                this.muscleToggle [k] = false;
                this.muscleValue [k]  = 0f;
            }

            len = PSMuscleDefine.masterMuscle.Length;
            this.muscleMasterValue = new float[len];
            for (int m = 0; m < len; m++)
            {
                this.muscleMasterValue [m] = 0f;
            }

            len = PSMuscleDefine.fingerMuscle.Length;
            this.muscleFingerValue = new float[len];
            for (int m = 0; m < len; m++)
            {
                this.muscleFingerValue [m] = 0f;
            }

            len        = PSMuscleDefine.rootProperty.Length;
            rootValue  = new float[len];
            rootToggle = new bool[len];

            Undo.undoRedoPerformed += UndoCallback;
        }