/// <summary> /// Called when Gizmo is drawn. /// </summary> private void OnDrawGizmos() { if (drawGizmo) { if (rootDatas == null) { return; } for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++) { List <SpringBoneData> roodData = rootDatas[rootIndex]; if (roodData == null) { continue; } // @notice Count - 1 for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++) { SpringBoneData boneData = roodData[boneIndex]; if (boneData == null) { continue; } boneData.verlet.DrawGizmo(gizmoColor); } } } }
/// <summary> /// /// </summary> private void FixedUpdate() { if (rootBones == null) { return; } if (rootDatas == null) { return; } CollectColliders(); float deltaTime = Time.deltaTime; float deltaStiffnessForce = stiffnessForce * deltaTime; Vector3 deltaGravityForce = gravityDirection * (gravityPower * deltaTime); for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++) { List <SpringBoneData> roodData = rootDatas[rootIndex]; if (roodData == null) { continue; } // @notice Count - 1 for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++) { SpringBoneData boneData = roodData[boneIndex]; if (boneData == null) { continue; } var verlet = boneData.verlet; verlet.headTransform = new SpringBoneTransformAccess(boneData.headTransform); verlet.parentRotation = boneData.parentTransform == null ? Quaternion.identity : boneData.parentTransform.rotation; verlet.currentTailPosition = boneData.currentTailPosition; verlet.previousTailPosition = boneData.previousTailPosition; verlet.stiffnessForce = deltaStiffnessForce; verlet.dragForce = dragForce; verlet.externalForce = deltaGravityForce; //verlet.colliderGroups = colliderGroups; verlet.colliders = colliders; verlet.hitRadius = hitRadius; verlet.Calculate(); boneData.headTransform.rotation = verlet.headTransformRotation; boneData.previousTailPosition = verlet.currentTailPosition; boneData.currentTailPosition = verlet.nextTailPosition; } } }
/// <summary> /// Set up the root bone and its child bones data. /// </summary> private void Setup() { rootDatas = new List <SpringBoneData> [rootBones.Length]; for (int rootIndex = 0; rootIndex < rootBones.Length; rootIndex++) { if (rootBones[rootIndex] == null) { continue; } rootDatas[rootIndex] = new List <SpringBoneData>(); SetupRecursive(rootIndex, rootBones[rootIndex]); } for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++) { List <SpringBoneData> roodData = rootDatas[rootIndex]; if (roodData == null) { continue; } // @notice Count - 1 for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++) { SpringBoneData boneData = roodData[boneIndex]; if (boneData == null) { continue; } boneData.parentTransform = boneData.headTransform.parent; boneData.tailTransform = rootDatas[rootIndex][boneIndex + 1].headTransform; boneData.boneAxis = boneData.tailTransform.localPosition.normalized; boneData.boneLength = boneData.tailTransform.localPosition.magnitude; boneData.currentTailPosition = boneData.tailTransform.position; boneData.previousTailPosition = boneData.currentTailPosition; boneData.verlet = new SpringBoneVerlet(boneData.boneAxis, boneData.boneLength, hitRadius); } } }