public void Process(Transform center) { m_center = center; if (Joints == null) { return; } // gather colliders if (m_colliderList == null) { m_colliderList = new List <SpringBoneLogic.InternalCollider>(); } m_colliderList.Clear(); if (ColliderGroups != null) { foreach (var group in ColliderGroups.Where(x => x != null)) { foreach (var collider in group.Colliders) { switch (collider.ColliderType) { case VRM10SpringBoneColliderTypes.Sphere: m_colliderList.Add(new SpringBoneLogic.InternalCollider { ColliderTypes = VRM10SpringBoneColliderTypes.Sphere, WorldPosition = collider.transform.TransformPoint(collider.Offset), Radius = collider.Radius, }); break; case VRM10SpringBoneColliderTypes.Capsule: m_colliderList.Add(new SpringBoneLogic.InternalCollider { ColliderTypes = VRM10SpringBoneColliderTypes.Capsule, WorldPosition = collider.transform.TransformPoint(collider.Offset), Radius = collider.Radius, WorldTail = collider.transform.TransformPoint(collider.Tail) }); break; } } } } if (m_logics == null) { m_logics = Enumerable.Zip(Joints, Joints.Skip(1), (head, tail) => { var localPosition = tail.transform.localPosition; var scale = tail.transform.lossyScale; var logic = new SpringBoneLogic(center, head.transform, new Vector3( localPosition.x * scale.x, localPosition.y * scale.y, localPosition.z * scale.z )); return(head, logic); }).ToList(); } foreach (var(head, logic) in m_logics) { logic.Update(center, head.m_stiffnessForce * Time.deltaTime, head.m_dragForce, head.m_gravityDir * (head.m_gravityPower * Time.deltaTime), m_colliderList, head.m_jointRadius); } }