using System.Collections; using System.Collections.Generic; using UnityEngine; public class FootIKTest : MonoBehaviour { Animator anim; public LayerMask layerMask; [Range(0, 1f)] public float DistanceToGround; private void Start() { anim = GetComponent(); } private void OnAnimatorIK(int layerIndex) { if (anim) { anim.SetIKPositionWeight(AvatarIKGoal.LeftFoot, anim.GetFloat("IKLeftFootWeight")); anim.SetIKRotationWeight(AvatarIKGoal.LeftFoot, anim.GetFloat("IKLeftFootWeight")); anim.SetIKPositionWeight(AvatarIKGoal.RightFoot, anim.GetFloat("IKRightFootWeight")); anim.SetIKRotationWeight(AvatarIKGoal.RightFoot, anim.GetFloat("IKRightFootWeight")); // Left Foot RaycastHit hit; Ray ray = new Ray(anim.GetIKPosition(AvatarIKGoal.LeftFoot) + Vector3.up, Vector3.down); if (Physics.Raycast(ray, out hit, DistanceToGround + 1f, layerMask)) { if (hit.transform.tag == "Walkable") { Vector3 footOriginForward = anim.GetBoneTransform(HumanBodyBones.LeftFoot).forward; Vector3 footPosition = hit.point; footPosition.y += DistanceToGround; anim.SetIKPosition(AvatarIKGoal.LeftFoot, footPosition); anim.SetIKRotation(AvatarIKGoal.LeftFoot, Quaternion.LookRotation(footOriginForward - Vector3.Dot(footOriginForward, hit.normal) *(hit.normal), hit.normal)); } } // Right Foot ray = new Ray(anim.GetIKPosition(AvatarIKGoal.RightFoot) + Vector3.up, Vector3.down); if (Physics.Raycast(ray, out hit, DistanceToGround + 1f, layerMask)) { if (hit.transform.tag == "Walkable") { Vector3 footOriginForward = anim.GetBoneTransform(HumanBodyBones.RightFoot).forward; Vector3 footPosition = hit.point; footPosition.y += DistanceToGround; anim.SetIKPosition(AvatarIKGoal.RightFoot, footPosition); anim.SetIKRotation(AvatarIKGoal.RightFoot, Quaternion.LookRotation(footOriginForward - Vector3.Dot(footOriginForward, hit.normal) * (hit.normal), hit.normal)); } } } } }