private void UpdateLocal(ISkeletonAnimation animated) { Transform thisTransform = transform; Vector2 thisTransformPosition = thisTransform.position; float centerOfGravityX = thisTransformPosition.x + centerOfGravityXOffset; nearFoot.UpdateDistance(centerOfGravityX); farFoot.UpdateDistance(centerOfGravityX); balance = nearFoot.displacementFromCenter + farFoot.displacementFromCenter; distanceBetweenFeet = Mathf.Abs(nearFoot.worldPos.x - farFoot.worldPos.x); // Detect time to make a new step bool isTooOffBalance = Mathf.Abs(balance) > offBalanceThreshold; bool isFeetTooFarApart = distanceBetweenFeet > feetTooFarApartThreshold; bool timeForNewStep = isFeetTooFarApart || isTooOffBalance; if (timeForNewStep) { // Choose which foot to use for next step. Foot stepFoot, otherFoot; bool stepLegIsNearLeg = nearFoot.distanceFromCenter > farFoot.distanceFromCenter; if (stepLegIsNearLeg) { stepFoot = nearFoot; otherFoot = farFoot; } else { stepFoot = farFoot; otherFoot = nearFoot; } // Start a new step. if (!stepFoot.IsStepInProgress && otherFoot.IsPrettyMuchDoneStepping) { float newDisplacement = Foot.GetNewDisplacement(otherFoot.displacementFromCenter, comfyDistance, minimumSpaceBetweenFeet, maxNewStepDisplacement, forward, backward); stepFoot.StartNewStep(newDisplacement, centerOfGravityX, thisTransformPosition.y, footRayRaise, hits, footSize); } } float deltaTime = Time.deltaTime; float stepSpeed = baseLerpSpeed; stepSpeed += (Mathf.Abs(balance) - 0.6f) * 2.5f; // Animate steps that are in progress. nearFoot.UpdateStepProgress(deltaTime, stepSpeed, shuffleDistance, forward, backward); farFoot.UpdateStepProgress(deltaTime, stepSpeed, shuffleDistance, forward, backward); nearFootBone.SetLocalPosition(thisTransform.InverseTransformPoint(nearFoot.worldPos)); farFootBone.SetLocalPosition(thisTransform.InverseTransformPoint(farFoot.worldPos)); }