public void ProcParam2(Maid slave, XtMasterSlave.MsLinks ms)
        {
            if (slave && !slave.boMAN && this.Hold_SlaveMaskItems.Length > 0)
            {
                //衣装マスク設定あり
                ms.holdSlvMask     = true;
                ms.holdSlvMaskMaid = slave;

                ms.holdSlvMaskItems.Clear();
                foreach (var s in this.Hold_SlaveMaskItems)
                {
                    ms.holdSlvMaskItems.Add(s);
                }
            }
        }
        public override bool UpdateFinalIK(Maid maid, XtMasterSlave.MsLinks ms, XtMasterSlave.MsLinkConfig mscfg)
        {
            if (!maid || !maid.body0)
            {
                return(false);
            }

            needInit = false;
            if (mscfg.doIK159NewPointToDef)
            {
                IKInit(maid, ms, mscfg);
            }
#if DEBUG
            else
            {
                IKInit4OldPoint(maid);
            }
#endif
            return(true); // 実行できたか
        }
        private void IKInit(Maid slave, XtMasterSlave.MsLinks ms, XtMasterSlave.MsLinkConfig mscfg)
        {
            var fik = slave.body0.IKCtrl.GetNonPublicField <RootMotion.FinalIK.FullBodyBipedIK>("m_FullbodyIK");

            RootMotion.FinalIK.FullBodyBipedIK FullbodyIK = fik;
            var solver = FullbodyIK.solver;

            string[] tgtlist = new string[] { "IKTarget", "BendBone", "ChainRootBone" };

            bool animStop = true; //モーション停止中

            if (ms.doMasterSlave && !mscfg.doStackSlave_PosSyncMode)
            {
                animStop = false;
            }
            else
            {
                Animation anim = slave.body0.m_Bones.GetComponent <Animation>();
                animStop = !anim.isPlaying;
            }

            if (!lastAnimeFNs.ContainsKey(slave) || slave.body0.LastAnimeFN != lastAnimeFNs[slave])
            {
                lastAnimeFNs[slave] = slave.body0.LastAnimeFN;
                animStop            = false;
            }

            solver.spineStiffness           = 1f;   //背骨の硬さ
            solver.pullBodyVertical         = 0.5f; //ボディエフェクター位置補正
            solver.pullBodyHorizontal       = 0f;
            solver.spineMapping.twistWeight = 0f;

            foreach (var e in solver.effectors)
            {
                if (solver.leftHandEffector == e || solver.rightHandEffector == e)
                {
                    // 手のIKは本体側に任せる
                    continue;
                }

                bool donotPin = false;

                if (animStop || donotPin)
                {
                    e.positionWeight = 1f;
                    e.rotationWeight = 0f;
                }
                else
                {
                    e.PinToBone(1f, 0f);
                }

                var tgtname = e.target.gameObject.name;

                if (donotPin)
                {
                    continue;
                }
                else
                {
                    if (tgtlist.Contains(tgtname))
                    {
                        // COM3D2標準ターゲット
                        e.target.transform.position = e.bone.position;
                        e.target.transform.rotation = e.bone.rotation;
                    }
                }
            }

            solver.rightShoulderEffector.positionWeight = 0.95f;
            solver.leftShoulderEffector.positionWeight  = 0.95f;

            solver.bodyEffector.rotationWeight = 1f;

            solver.rightThighEffector.positionWeight = 0.95f;
            solver.leftThighEffector.positionWeight  = 0.95f;

            if (mscfg != null && mscfg.doFinalIKShoulderMove)
            {
                solver.rightShoulderEffector.positionWeight = 0f;
                solver.leftShoulderEffector.positionWeight  = 0f;
            }
            if (mscfg != null && mscfg.doFinalIKThighMove)
            {
                solver.bodyEffector.rotationWeight = 0f;

                solver.rightThighEffector.positionWeight = 0f;
                solver.leftThighEffector.positionWeight  = 0f;
            }

            foreach (var m in solver.limbMappings)
            {
                m.weight = 1f;
                m.maintainRotationWeight = 0f;
            }

            if (mscfg != null)
            {
                solver.rightLegMapping.weight = mscfg.fFinalIKLegWeight; //0.5f;
                solver.leftLegMapping.weight  = mscfg.fFinalIKLegWeight; //0.5f;
            }
            solver.rightLegMapping.maintainRotationWeight = 1f;
            solver.leftLegMapping.maintainRotationWeight  = 1f;
        }
        //この保存用クラスに読込
        public void SetParam(bool linking, bool isMasterMaid, XtMasterSlave.MsLinks ms)
        {
            doMasterSlave     = linking;
            this.isMasterMaid = isMasterMaid;

            XtMasterSlave.ManInfo master = null;
            XtMasterSlave.ManInfo slave  = null;

            if (ms.mdMaster_No >= 0)
            {
                master = new XtMasterSlave.ManInfo(ms.mdMasters[ms.mdMaster_No].mem, ms.mdMaster_No);
            }
            if (ms.mdSlave_No >= 0)
            {
                slave = new XtMasterSlave.ManInfo(ms.mdSlaves[ms.mdSlave_No].mem, ms.mdSlave_No);
            }

            if (master != null)
            {
                if (master.mem.boMAN)
                {
                    Master_Name = XtMasterSlave.GetMaidName(master);
                }
                else
                {
                    Master_Name = XtMasterSlave.GetMaidName(master.mem);
                }
                Master_ID = master.mem_id;
            }
            else
            {
                Master_Name = string.Empty;
                Master_ID   = ms.mdMaster_No;
            }

            if (slave != null)
            {
                if (slave.mem.boMAN)
                {
                    Slave_Name = XtMasterSlave.GetMaidName(slave);
                }
                else
                {
                    Slave_Name = XtMasterSlave.GetMaidName(slave.mem);
                }
                Slave_ID = slave.mem_id;
            }
            else
            {
                Slave_Name = string.Empty;
                Slave_ID   = ms.mdSlave_No;
            }

            if (master != null)
            {
                Scale_Master = (master.mem.gameObject.transform.localScale.x + master.mem.gameObject.transform.localScale.y + master.mem.gameObject.transform.localScale.z) / 3;
            }
            if (slave != null)
            {
                Scale_Slave = (slave.mem.gameObject.transform.localScale.x + slave.mem.gameObject.transform.localScale.y + slave.mem.gameObject.transform.localScale.z) / 3;
            }

            if (master != null)
            {
                if (master.mem.boMAN)
                {
                    Master_Hide = !XtMasterSlave.GetManVisible(master.mem);

                    Cnk_Visible = XtMasterSlave.GetChinkoVisible(master.mem.body0);
                    Cnk_Scale   = XtMasterSlave.GetChinkoScale(master.mem.body0).x;
                    manAlpha    = XtMasterSlave.GetManAlpha(master.mem);

                    Cnk_OffsetPos = XtMasterSlave.v3Tofa(XtMasterSlave.GetChinkoPos(master.mem.body0));
                }
                else
                {
                    Master_Hide = XtMasterSlave.GetStateMaskItemsAll(master.mem);

                    if (slave.mem.boMAN)
                    {
                        Cnk_Visible = XtMasterSlave.GetChinkoVisible(slave.mem.body0);
                        Cnk_Scale   = XtMasterSlave.GetChinkoScale(slave.mem.body0).x;
                        manAlpha    = XtMasterSlave.GetManAlpha(slave.mem);

                        Cnk_OffsetPos = XtMasterSlave.v3Tofa(XtMasterSlave.GetChinkoPos(slave.mem.body0));
                    }
                }
            }

            if (slave != null)
            {
                if (!slave.mem.boMAN)
                {
                    Stgt_boHeadToCam = slave.mem.body0.boHeadToCam;
                    Stgt_boEyeToCam  = slave.mem.body0.boEyeToCam;
                    //Stgt_hashTarget = slave.mem.body0.trsLookTarget.GetHashCode();
                    Stgt_sBoneName = slave.mem.body0.trsLookTarget.name;

                    switch (Stgt_sBoneName)
                    {
                    case "Bip01 Head":
                        break;

                    case "_IK_vagina":
                        break;

                    case "ManBip Head":
                        break;

                    case "chinko2":
                        break;

                    default:
                        Stgt_sBoneName = string.Empty;
                        break;
                    }
                }
            }

            if (slave != null)
            {
                if (!slave.mem.boMAN)
                {
                    //アイテムマスク
                    if (ms.holdSlvMask && ms.holdSlvMaskMaid == slave.mem)
                    {
                        Hold_SlaveMaskItems = ms.holdSlvMaskItems.ToArray();
                    }
                    else
                    {
                        Hold_SlaveMaskItems = new string[0];
                    }
                }
            }
        }
        /*public UserConfigPage(bool linking, bool isMasterMaid, XtMasterSlave.ManInfo master, XtMasterSlave.ManInfo slave)
         * {
         *  SetParam(linking, isMasterMaid, master, slave);
         * }
         *
         * public void SetParam(bool linking, bool isMasterMaid, XtMasterSlave.ManInfo master, XtMasterSlave.ManInfo slave)
         */

        public UserConfigPage(bool linking, bool isMasterMaid, XtMasterSlave.MsLinks ms)
        {
            SetParam(linking, isMasterMaid, ms);
        }