void OnWizardUpdate()
        {
            if (BoneSettingName == null)
            {
                BoneSettingName = new string[boneObjects.Length];
                for (int i = 0; i < boneObjects.Length; i++)
                {
                    DynamicBoneSetting setting = (DynamicBoneSetting)boneObjects[i];

                    if (setting.m_Root != null)
                    {
                        BoneSettingName[i] = setting.m_Root.ToString();
                    }
                }
            }
            if (ColliderSettingName == null)
            {
                ColliderSettingName = new string[colliderObjects.Length];
                for (int i = 0; i < colliderObjects.Length; i++)
                {
                    DynamicBoneColliderSetting setting
                        = (DynamicBoneColliderSetting)colliderObjects[i];
                    ColliderSettingName[i] = setting.TargetName;
                }
            }
        }
        void ApplyVRMSpringBone()
        {
            for (int j = 0; j < boneObjects.Length; j++)
            {
                GameObject findObject = null;
                //設定データ
                DynamicBoneSetting settingData = (DynamicBoneSetting)boneObjects[j];
                //対象のボーン
                GameObject    targetObject = GameObject.Find(settingData.m_AttachObject);
                VRMSpringBone springbone   = targetObject.AddComponent <VRMSpringBone>();

                springbone.m_stiffnessForce = settingData.m_Stiffness * 4.0f;

                //重力の設定 大きさが0であればY方向-1に設定
                //大きさは2以上は2にする
                springbone.m_gravityPower = settingData.m_Gravity.magnitude;

                if (springbone.m_gravityPower > 2.0f)
                {
                    springbone.m_gravityPower = 2.0f;
                }

                if (springbone.m_gravityPower != 0)
                {
                    springbone.m_gravityDir = settingData.m_Gravity / settingData.m_Gravity.magnitude;
                }
                else
                {
                    springbone.m_gravityDir = new Vector3(0, -1.0f, 0);
                }

                springbone.RootBones = new List <Transform>();
                findObject           = GameObject.Find(settingData.m_Root);
                springbone.RootBones.Add(findObject.GetComponent <Transform>());

                springbone.m_hitRadius = settingData.m_Radius;

                springbone.ColliderGroups = new VRMSpringBoneColliderGroup[settingData.m_Colliders.Count];
                for (int i = 0; i < settingData.m_Colliders.Count; i++)
                {
                    findObject = GameObject.Find(settingData.m_Colliders[i]);
                    springbone.ColliderGroups[i] = findObject.GetComponent <VRMSpringBoneColliderGroup>();
                }
            }
        }
        void ExportDynamicBone()
        {
            DynamicBone[]  bones = targetModel.GetComponentsInChildren <DynamicBone>();

            //gizmo以外はエクスポート 
            //transformは名前をエクスポートする(インポート時にFindで探す)
            for (int j = 0; j < bones.Length; j++)
            {
                DynamicBone dynamicbone = bones[j];

                DynamicBoneSetting exportData
                    = ScriptableObject.CreateInstance <DynamicBoneSetting>();

                //フルパスを取得する
                exportData.m_AttachObject = m_Utility.GetHierarchyPath(dynamicbone.gameObject.transform);

                if (dynamicbone.m_Root != null)
                {
                    exportData.m_Root = m_Utility.GetHierarchyPath(dynamicbone.m_Root);
                }

                exportData.m_UpdateRate        = dynamicbone.m_UpdateRate;
                exportData.m_UpdateMode        = dynamicbone.m_UpdateMode;
                exportData.m_Damping           = dynamicbone.m_Damping;
                exportData.m_DampingDistrib    = dynamicbone.m_DampingDistrib;
                exportData.m_Elasticity        = dynamicbone.m_Elasticity;
                exportData.m_ElasticityDistrib = dynamicbone.m_ElasticityDistrib;
                exportData.m_Stiffness         = dynamicbone.m_Stiffness;
                exportData.m_StiffnessDistrib  = dynamicbone.m_StiffnessDistrib;
                exportData.m_Inert             = dynamicbone.m_Inert;
                exportData.m_InertDistrib      = dynamicbone.m_InertDistrib;
                exportData.m_Radius            = dynamicbone.m_Radius;
                exportData.m_RadiusDistrib     = dynamicbone.m_RadiusDistrib;
                exportData.m_EndLength         = dynamicbone.m_EndLength;
                exportData.m_EndOffset         = dynamicbone.m_EndOffset;
                exportData.m_Gravity           = dynamicbone.m_Gravity;
                exportData.m_Force             = dynamicbone.m_Force;

                exportData.m_Colliders = new List <string>();
                foreach (DynamicBoneCollider collider in dynamicbone.m_Colliders)
                {
                    if (collider == null)
                    {
                        Debug.Log(dynamicbone.gameObject.transform + "はcolliderがnullだからskipしたよ");
                    }
                    else
                    {
                        string colliderName = m_Utility.GetHierarchyPath(collider.gameObject.transform);
                        exportData.m_Colliders.Add(colliderName);

                        //コライダーのついているオブジェクトの名前を登録する(重複なし、なければ追加)
                        if (ColliderTergetName.Count == 0)
                        {
                            ColliderTergetName.Add(colliderName);
                        }
                        else
                        {
                            if (ColliderTergetName.IndexOf(colliderName) == -1)
                            {
                                ColliderTergetName.Add(colliderName);
                            }
                            ;
                        }
                    }
                }

                exportData.m_Exclusions = new List <string>();
                if (dynamicbone.m_Exclusions != null)
                {
                    foreach (Transform exclusion in dynamicbone.m_Exclusions)
                    {
                        exportData.m_Exclusions.Add(m_Utility.GetHierarchyPath(exclusion));
                    }
                }

                exportData.m_FreezeAxis     = dynamicbone.m_FreezeAxis;
                exportData.m_DistantDisable = dynamicbone.m_DistantDisable;

                if (dynamicbone.m_ReferenceObject != null)
                {
                    exportData.m_ReferenceObject
                        = m_Utility.GetHierarchyPath(dynamicbone.m_ReferenceObject.transform);
                }

                exportData.m_DistanceToObject = dynamicbone.m_DistanceToObject;

                AssetDatabase.CreateAsset(
                    exportData, "Assets/Models/Resources/DynamicBoneData/DynamicBone/DynamicBoneData_" + j + ".asset");
            }
        }
        void ApplyDynamicBone()
        {
            //gizmo以外は設定を反映
            //transformはFind後したTransformを反映)
            for (int j = 0; j < boneObjects.Length; j++)
            {
                //設定データ
                DynamicBoneSetting settingData = (DynamicBoneSetting)boneObjects[j];

                //内部変数の定義
                GameObject findObject = null;

                //対象のボーン
                //m_Utility.ChangeRootPath 設定されたパスをターゲット対象に変更する
                GameObject targetObject
                    = GameObject.Find(m_Utility.ChangeRootPath(settingData.m_AttachObject, targetModel.name));
                DynamicBone dynamicbone = targetObject.AddComponent <DynamicBone>();

                findObject
                    = GameObject.Find(m_Utility.ChangeRootPath(settingData.m_Root, targetModel.name));
                dynamicbone.m_Root = findObject.GetComponent <Transform>();

                dynamicbone.m_UpdateRate        = settingData.m_UpdateRate;
                dynamicbone.m_UpdateMode        = settingData.m_UpdateMode;
                dynamicbone.m_Damping           = settingData.m_Damping;
                dynamicbone.m_DampingDistrib    = settingData.m_DampingDistrib;
                dynamicbone.m_Elasticity        = settingData.m_Elasticity;
                dynamicbone.m_ElasticityDistrib = settingData.m_ElasticityDistrib;
                dynamicbone.m_Stiffness         = settingData.m_Stiffness;
                dynamicbone.m_StiffnessDistrib  = settingData.m_StiffnessDistrib;
                dynamicbone.m_Inert             = settingData.m_Inert;
                dynamicbone.m_InertDistrib      = settingData.m_InertDistrib;
                dynamicbone.m_Radius            = settingData.m_Radius;
                dynamicbone.m_RadiusDistrib     = settingData.m_RadiusDistrib;
                dynamicbone.m_EndLength         = settingData.m_EndLength;
                dynamicbone.m_EndOffset         = settingData.m_EndOffset;
                dynamicbone.m_Gravity           = settingData.m_Gravity;
                dynamicbone.m_Force             = settingData.m_Force;

                dynamicbone.m_Colliders = new List <DynamicBoneColliderBase>();

                if (settingData.m_Colliders != null)
                {
                    foreach (string collider in settingData.m_Colliders)
                    {
                        findObject
                            = GameObject.Find(m_Utility.ChangeRootPath(collider, targetModel.name));
                        if (findObject != null)
                        {
                            dynamicbone.m_Colliders.Add(findObject.GetComponent <DynamicBoneCollider>());
                        }
                    }
                }

                if (settingData.m_Exclusions != null)
                {
                    dynamicbone.m_Exclusions = new List <Transform>();

                    foreach (string exclusion in settingData.m_Exclusions)
                    {
                        findObject
                            = GameObject.Find(m_Utility.ChangeRootPath(exclusion, targetModel.name));
                        if (findObject != null)
                        {
                            dynamicbone.m_Exclusions.Add(findObject.GetComponent <Transform>());
                        }
                    }
                }

                dynamicbone.m_FreezeAxis     = settingData.m_FreezeAxis;
                dynamicbone.m_DistantDisable = settingData.m_DistantDisable;

                if (settingData.m_ReferenceObject != null)
                {
                    findObject
                        = GameObject.Find(m_Utility.ChangeRootPath(settingData.m_ReferenceObject, targetModel.name));
                    if (findObject != null)
                    {
                        dynamicbone.m_ReferenceObject = findObject.GetComponent <Transform>();
                    }
                }

                dynamicbone.m_DistanceToObject = settingData.m_DistanceToObject;
            }
        }