Пример #1
0
        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));
        }