using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BNG { /// /// This Component allows a generic humanoid rig to follow the Player's controller's and HMD using Unity's IK system /// public class CharacterIK : MonoBehaviour { /// /// The Left Controller our Left Hand IK should track /// public Transform FollowLeftController; /// /// The Right Controller our Right Hand IK should track /// public Transform FollowRightController; public Transform FollowLeftFoot; public Transform FollowRightFoot; public Transform FollowHead; /// /// Character's IK Feet will move up to this position. In World Space. /// public float FootYPosition = 0; /// /// If false the IK layers will be deactivated /// public bool IKActive = true; /// /// Should the player's feet follow our given Y axis using IK /// public bool IKFeetActive = true; public bool HideHead = true; public bool HideLeftArm = false; public bool HideRightArm = false; public bool HideLeftHand = false; public bool HideRightHand = false; public bool HideLegs = false; /// /// The Hips joint of the Character. Used for hiding the legs by scaling the joint to 0 /// public Transform HipsJoint; /// /// The player our Body will follow /// public CharacterController FollowPlayer; Transform headBone; Transform leftShoulderJoint; Transform rightShoulderJoint; Transform leftHandJoint; Transform rightHandJoint; Animator animator; public float HipOffset = 0; // Start is called before the first frame update void Start() { animator = GetComponent(); headBone = animator.GetBoneTransform(HumanBodyBones.Head); leftHandJoint = animator.GetBoneTransform(HumanBodyBones.LeftHand); rightHandJoint = animator.GetBoneTransform(HumanBodyBones.RightHand); leftShoulderJoint = animator.GetBoneTransform(HumanBodyBones.LeftShoulder); rightShoulderJoint = animator.GetBoneTransform(HumanBodyBones.RightShoulder); } public Vector3 hideBoneScale = new Vector3(0.0001f, 0.0001f, 0.0001f); void Update() { // Hide Headbone if (headBone != null) { headBone.localScale = HideHead ? Vector3.zero : Vector3.one; } // Hide Left Arm if (leftShoulderJoint != null) { leftShoulderJoint.localScale = HideLeftArm ? hideBoneScale : Vector3.one; } // Hide Right Arm if (rightShoulderJoint != null) { rightShoulderJoint.localScale = HideRightArm ? hideBoneScale : Vector3.one; } // Hide Left Hand if (leftHandJoint != null) { leftHandJoint.localScale = HideLeftHand ? Vector3.zero : Vector3.one; } // Hide Right Hand if (rightHandJoint != null) { rightHandJoint.localScale = HideRightHand ? Vector3.zero : Vector3.one; } // Hide Legs if(HipsJoint) { HipsJoint.localScale = HideLegs ? Vector3.zero : Vector3.one; } Transform hipJoint = animator.GetBoneTransform(HumanBodyBones.RightShoulder); } void OnAnimatorIK() { if (animator) { //if the IK is active, set the position and rotation directly to the goal. if (IKActive) { // Head if (FollowHead != null) { animator.SetLookAtWeight(1); animator.SetLookAtPosition(FollowHead.position); } // Left Hand if (FollowLeftController != null) { animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1); animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1); animator.SetIKPosition(AvatarIKGoal.LeftHand, FollowLeftController.position); animator.SetIKRotation(AvatarIKGoal.LeftHand, FollowLeftController.rotation); } // Right Hand if (FollowRightController != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1); animator.SetIKPosition(AvatarIKGoal.RightHand, FollowRightController.position); animator.SetIKRotation(AvatarIKGoal.RightHand, FollowRightController.rotation); } // Left Foot if(IKFeetActive) { // Left Foot if (FollowLeftFoot != null) { animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1); animator.SetIKPosition(AvatarIKGoal.LeftFoot, new Vector3(FollowLeftFoot.position.x, FootYPosition, FollowLeftFoot.position.z)); } // Right Foot if (FollowRightFoot != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1); animator.SetIKPosition(AvatarIKGoal.RightFoot, new Vector3(FollowRightFoot.position.x, FootYPosition, FollowRightFoot.position.z)); } // Testing body IK //animator.bodyPosition = new Vector3(animator.bodyPosition.x, animator.bodyPosition.y + HipOffset + FollowPlayer.height, animator.bodyPosition.z); } else { // Left Foot if (FollowLeftFoot != null) { animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0); } // Right Foot if (FollowRightFoot != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 0); } } } // IK not active, release weight for hands / head else { animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0); animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0); animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0); animator.SetLookAtWeight(0); } } } } }