PlayerController IK Feet | FEP

PHOTO EMBED

Thu May 26 2022 15:56:20 GMT+0000 (Coordinated Universal Time)

Saved by @DanDHenshaw

using System;
using UnityEngine;
using Cinemachine;
using Photon.Pun;
using Photon.Realtime;
using ExitGames.Client.Photon;

public class PlayerController : MonoBehaviourPunCallbacks
{
    private Animator _playerAnimator;

    [Header("Inverse Kinematics")]
    [Range(0,1)]
    public float DistanceToGround;
    public LayerMask IKLayer;

    private void OnAnimatorIK(int layerIndex)
    {
        if (_playerAnimator)
        {
            float IKLeftFootWeight = _playerAnimator.GetFloat("IKLeftFootWeight");
            float IKRightFootWeight = _playerAnimator.GetFloat("IKRightFootWeight");

            _playerAnimator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, IKLeftFootWeight);
            _playerAnimator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, IKLeftFootWeight);
            _playerAnimator.SetIKPositionWeight(AvatarIKGoal.RightFoot, IKRightFootWeight);
            _playerAnimator.SetIKRotationWeight(AvatarIKGoal.RightFoot, IKRightFootWeight);
            
            // Left foot
            RaycastHit hit;
            Ray ray = new Ray(_playerAnimator.GetIKPosition(AvatarIKGoal.LeftFoot) + Vector3.up, Vector3.down);
            if (Physics.Raycast(ray, out hit, DistanceToGround + 1f, IKLayer))
            {
                Vector3 footPosition = hit.point;
                footPosition.y += DistanceToGround;
                _playerAnimator.SetIKPosition(AvatarIKGoal.LeftFoot, footPosition);
                
                Vector3 forward = Vector3.ProjectOnPlane(transform.forward, hit.normal);
                _playerAnimator.SetIKRotation(AvatarIKGoal.LeftFoot, Quaternion.LookRotation(forward,hit.normal)); 
            }
            
            // Right foot
            ray = new Ray(_playerAnimator.GetIKPosition(AvatarIKGoal.RightFoot) + Vector3.up, Vector3.down);
            if (Physics.Raycast(ray, out hit, DistanceToGround + 1f, IKLayer))
            {
                Vector3 footPosition = hit.point;
                footPosition.y += DistanceToGround;
                _playerAnimator.SetIKPosition(AvatarIKGoal.RightFoot, footPosition);
                
                Vector3 forward = Vector3.ProjectOnPlane(transform.forward, hit.normal);
                _playerAnimator.SetIKRotation(AvatarIKGoal.RightFoot, Quaternion.LookRotation(forward,hit.normal)); 
            }
        }
    }
}
content_copyCOPY