/// <summary> /// 指定された<see cref="VRMSpringBone"/>を基に<see cref="DynamicBone"/>を設定します。 /// </summary> /// <param name="springBone"></param> /// <param name="dynamicBoneColliderGroups">キーに<see cref="VRMSpringBoneColliderGroup"/>、値に対応する<see cref="DynamicBoneCollider"/>のリストを持つジャグ配列。</param> /// <param name="swayingParametersConverter"></param> private static void ConvertVRMSpringBone( VRMSpringBone springBone, IDictionary <VRMSpringBoneColliderGroup, IEnumerable <MonoBehaviour> > dynamicBoneColliderGroups, Converter.SwayingParametersConverter swayingParametersConverter ) { var springBoneParameters = new SpringBoneParameters(stiffnessForce: springBone.m_stiffnessForce, dragForce: springBone.m_dragForce); var boneInfo = new BoneInfo(vrmMeta: springBone.gameObject.GetComponentsInParent <VRMMeta>()[0]); foreach (var transform in springBone.RootBones) { var dynamicBone = springBone.gameObject.AddComponent(DynamicBoneType); DynamicBoneType.GetField("m_Root").SetValue(dynamicBone, transform); DynamicBoneType.GetField("m_Exclusions").SetValue(dynamicBone, new List <Transform>()); DynamicBoneParameters dynamicBoneParameters = null; if (swayingParametersConverter != null) { dynamicBoneParameters = swayingParametersConverter( springBoneParameters: springBoneParameters, boneInfo: boneInfo ); } if (dynamicBoneParameters != null) { DynamicBoneType.GetField("m_Damping").SetValue(dynamicBone, dynamicBoneParameters.Damping); DynamicBoneType.GetField("m_DampingDistrib") .SetValue(dynamicBone, dynamicBoneParameters.DampingDistrib); DynamicBoneType.GetField("m_Elasticity").SetValue(dynamicBone, dynamicBoneParameters.Elasticity); DynamicBoneType.GetField("m_ElasticityDistrib") .SetValue(dynamicBone, dynamicBoneParameters.ElasticityDistrib); DynamicBoneType.GetField("m_Stiffness").SetValue(dynamicBone, dynamicBoneParameters.Stiffness); DynamicBoneType.GetField("m_StiffnessDistrib") .SetValue(dynamicBone, dynamicBoneParameters.StiffnessDistrib); DynamicBoneType.GetField("m_Inert").SetValue(dynamicBone, dynamicBoneParameters.Inert); DynamicBoneType.GetField("m_InertDistrib") .SetValue(dynamicBone, dynamicBoneParameters.InertDistrib); } DynamicBoneType.GetField("m_Gravity") .SetValue(dynamicBone, springBone.m_gravityDir * springBone.m_gravityPower); DynamicBoneType.GetField("m_Radius").SetValue(dynamicBone, springBone.m_hitRadius); if (dynamicBoneColliderGroups != null) { var colliders = Activator.CreateInstance(type: DynamicBoneColliderBaseListType); MethodInfo addMethod = DynamicBoneColliderBaseListType.GetMethod("Add"); foreach (var collider in springBone.ColliderGroups.SelectMany( colliderGroup => dynamicBoneColliderGroups[colliderGroup] )) { addMethod.Invoke(colliders, new[] { collider }); } DynamicBoneType.GetField("m_Colliders").SetValue(dynamicBone, colliders); } } }
/// <summary> /// <see cref="ComponentsReplacer.SwayingParametersConverter">の既定値。 /// </summary> /// <param name="springBoneParameters"></param> /// <param name="boneInfo"></param> /// <returns></returns> internal static SpringBoneParameters DefaultSwayingParametersConverter( DynamicBoneParameters dynamicBoneParameters, BoneInfo boneInfo ) { return(new SpringBoneParameters() { StiffnessForce = dynamicBoneParameters.Elasticity / 0.05f, DragForce = dynamicBoneParameters.Damping / 0.6f, }); }
/// <summary> /// 指定された<see cref="VRMSpringBone"/>を基に<see cref="DynamicBone"/>を設定します。 /// </summary> /// <param name="springBone"></param> /// <param name="dynamicBoneColliderGroups">キーに<see cref="VRMSpringBoneColliderGroup"/>、値に対応する<see cref="DynamicBoneCollider"/>のリストを持つジャグ配列。</param> /// <param name="swayingParametersConverter"></param> private static void ConvertVRMSpringBone( VRMSpringBone springBone, IDictionary <VRMSpringBoneColliderGroup, IEnumerable <dynamic> > dynamicBoneColliderGroups, Converter.SwayingParametersConverter swayingParametersConverter ) { var springBoneParameters = new SpringBoneParameters() { StiffnessForce = springBone.m_stiffnessForce, DragForce = springBone.m_dragForce, }; var boneInfo = new BoneInfo(vrmMeta: springBone.gameObject.GetComponentsInParent <VRMMeta>()[0]); foreach (var transform in springBone.RootBones) { dynamic dynamicBone = springBone.gameObject.AddComponent(DynamicBoneType); dynamicBone.m_Root = transform; dynamicBone.m_Exclusions = new List <Transform>(); DynamicBoneParameters dynamicBoneParameters = null; if (swayingParametersConverter != null) { dynamicBoneParameters = swayingParametersConverter( springBoneParameters: springBoneParameters, boneInfo: boneInfo ); } if (dynamicBoneParameters != null) { dynamicBone.m_Damping = dynamicBoneParameters.Damping; dynamicBone.m_DampingDistrib = dynamicBoneParameters.DampingDistrib; dynamicBone.m_Elasticity = dynamicBoneParameters.Elasticity; dynamicBone.m_ElasticityDistrib = dynamicBoneParameters.ElasticityDistrib; dynamicBone.m_Stiffness = dynamicBoneParameters.Stiffness; dynamicBone.m_StiffnessDistrib = dynamicBoneParameters.StiffnessDistrib; dynamicBone.m_Inert = dynamicBoneParameters.Inert; dynamicBone.m_InertDistrib = dynamicBoneParameters.InertDistrib; } dynamicBone.m_Gravity = springBone.m_gravityDir * springBone.m_gravityPower; dynamicBone.m_Radius = springBone.m_hitRadius; if (dynamicBoneColliderGroups != null) { dynamic colliders = Activator.CreateInstance(type: DynamicBoneColliderBaseListType); foreach (var collider in springBone.ColliderGroups.SelectMany( colliderGroup => dynamicBoneColliderGroups[colliderGroup] )) { colliders.Add(collider); } dynamicBone.m_Colliders = colliders; } } }