Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public LayerMask ground;
- public float pelvisHeightOffset;
- public float IKGroundCheckDistance;
- Animator animator;
- CharacterController characterController;
- Vector3 leftFootIKPosition;
- Vector3 rightFootIKPosition;
- Quaternion leftFootIKRotation;
- Quaternion rightFootIKRotation;
- void Start()
- {
- characterController = GetComponent<CharacterController>();
- animator = GetComponent<Animator>();
- }
- void Update()
- {
- FeetPositionSolver(animator.GetBoneTransform(HumanBodyBones.RightFoot).position + Vector3.up, ref rightFootIKPosition, ref rightFootIKRotation);
- FeetPositionSolver(animator.GetBoneTransform(HumanBodyBones.LeftFoot).position + Vector3.up, ref leftFootIKPosition, ref leftFootIKRotation);
- }
- private void FeetPositionSolver(Vector3 fromSkyPosition, ref Vector3 feetIKPosition, ref Quaternion feetIkRotation)
- {
- RaycastHit feetOutHit;
- if (Physics.Raycast(fromSkyPosition, Vector3.down, out feetOutHit, IKGroundCheckDistance, ground, QueryTriggerInteraction.Ignore))
- {
- feetIKPosition = fromSkyPosition;
- feetIKPosition.y = feetOutHit.point.y + pelvisHeightOffset;
- feetIkRotation = Quaternion.FromToRotation(Vector3.up, feetOutHit.normal) * transform.rotation;
- return;
- }
- feetIKPosition = Vector3.zero;
- }
- float lastFootPositionY;
- float lastFootPositionY1;
- private void OnAnimatorIK(int layerIndex)
- {
- animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, animator.GetFloat("LeftFootPlantingRotation"));
- animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, animator.GetFloat("RightFootPlantingRotation"));
- animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
- animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
- MoveFeetToIkPoint(AvatarIKGoal.LeftFoot, leftFootIKPosition, leftFootIKRotation, ref lastFootPositionY);
- MoveFeetToIkPoint(AvatarIKGoal.RightFoot, rightFootIKPosition, rightFootIKRotation, ref lastFootPositionY1);
- MovePelvisHeight();
- }
- public float feetIKPositionSpeed;
- void MoveFeetToIkPoint(AvatarIKGoal foot, Vector3 positionIKHolder, Quaternion rotationIKHolder, ref float lastFootPositionY)
- {
- Vector3 targetIKPosition = animator.GetIKPosition(foot);
- if (positionIKHolder != Vector3.zero)
- {
- targetIKPosition = transform.InverseTransformPoint(targetIKPosition);
- positionIKHolder = transform.InverseTransformPoint(positionIKHolder);
- float yVariable = Mathf.Lerp(lastFootPositionY, positionIKHolder.y, feetIKPositionSpeed);
- targetIKPosition.y += yVariable;
- lastFootPositionY = yVariable;
- targetIKPosition = transform.TransformPoint(targetIKPosition);
- animator.SetIKRotation(foot, rotationIKHolder);
- }
- animator.SetIKPosition(foot, targetIKPosition);
- }
- public float lastPelvisPositionY;
- public float pelvisDampSpeed;
- private void MovePelvisHeight()
- {
- if (rightFootIKPosition == Vector3.zero || leftFootIKPosition == Vector3.zero || lastPelvisPositionY == 0)
- {
- lastPelvisPositionY = animator.bodyPosition.y;
- return;
- }
- float lOffset = leftFootIKPosition.y - transform.position.y;
- float rOffset = rightFootIKPosition.y - transform.position.y;
- float totalOffset = (lOffset < rOffset) ? lOffset : rOffset;
- if (Mathf.Abs(totalOffset) > 0.7f)
- {
- lastPelvisPositionY = animator.bodyPosition.y;
- return;
- }
- Vector3 newPelvisPosition = animator.bodyPosition + Vector3.up * totalOffset;
- newPelvisPosition.y = Mathf.Lerp(lastPelvisPositionY, newPelvisPosition.y, pelvisDampSpeed);
- animator.bodyPosition = newPelvisPosition;
- lastPelvisPositionY = animator.bodyPosition.y;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement