コード例 #1
0
            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);
                }
            }