using RootMotion.FinalIK; using UnityEngine; public class PlayerIK : MonoBehaviour { public enum UpdateType { Update = 0, FixedUpdate = 1, LateUpdate = 2, Default = 3 } public UpdateType UpdateSelected; [SerializeField] private Transform _LeftHandTransform; private LookAtIK _LookAtIK; private AimIK _AimIK; private FullBodyBipedIK _FullBodyIK; private ArmIK _ArmIK; private bool _isLeftHandEnabled; private bool _isRightHandEnabled; public bool isAimEnabled; private bool _isFishingLeftArmEnabled; [SerializeField] private float transitionWeightTimeScale = 1f; public Transform CurrentTarget => _FullBodyIK.solver.leftHandEffector.target; public Transform LeftHandTransform => _LeftHandTransform; private void Awake() { _LookAtIK = GetComponent(); _AimIK = GetComponent(); _FullBodyIK = GetComponent(); _ArmIK = GetComponent(); SetAimIK(enabled: false); } public void SetBipedIK(bool enabled) { } public void SetFishingLeftArm(bool enabled) { _isFishingLeftArmEnabled = enabled; } public void SetFishingLeftArm(bool enabled, Transform target) { _isFishingLeftArmEnabled = enabled; _ArmIK.solver.arm.target = target; } public void SetBipedLeftHandIK(bool enabled, bool instant = false) { _isLeftHandEnabled = enabled; if (instant) { _FullBodyIK.solver.leftArmMapping.weight = (enabled ? 1f : 0f); } } public void SetBipedRightHandIK(bool enabled, bool instant = false) { _isRightHandEnabled = enabled; if (instant) { _FullBodyIK.solver.rightArmMapping.weight = (enabled ? 1f : 0f); } } public void SetBipedLeftHandIK(bool enabled, Transform target, bool instant = false) { _isLeftHandEnabled = enabled; _FullBodyIK.solver.leftHandEffector.target = target; if (instant) { _FullBodyIK.solver.leftArmMapping.weight = (enabled ? 1f : 0f); } } public void SetBipedRightHandIK(bool enabled, Transform target, bool instant = false) { _isRightHandEnabled = enabled; _FullBodyIK.solver.rightHandEffector.target = target; if (instant) { _FullBodyIK.solver.rightArmMapping.weight = (enabled ? 1f : 0f); } } public void SetAimIK(bool enabled) { isAimEnabled = enabled; } private void Update() { if (UpdateSelected == UpdateType.Update) { IKUpdateHandler(); } } private void FixedUpdate() { if (UpdateSelected == UpdateType.FixedUpdate) { IKUpdateHandler(); } } private void LateUpdate() { if (UpdateSelected == UpdateType.LateUpdate) { IKUpdateHandler(); } } private void IKUpdateHandler() { _AimIK.UpdateSolverExternal(); _LookAtIK.UpdateSolverExternal(); _FullBodyIK.UpdateSolverExternal(); _FullBodyIK.solver.Update(); _AimIK.solver.IKPositionWeight = Mathf.MoveTowards(_AimIK.solver.IKPositionWeight, isAimEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); _FullBodyIK.solver.leftArmMapping.weight = Mathf.MoveTowards(_FullBodyIK.solver.leftArmMapping.weight, _isLeftHandEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); _FullBodyIK.solver.rightArmMapping.weight = Mathf.MoveTowards(_FullBodyIK.solver.rightArmMapping.weight, _isRightHandEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); _FullBodyIK.solver.IKPositionWeight = Mathf.MoveTowards(_FullBodyIK.solver.IKPositionWeight, _isLeftHandEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); _ArmIK.solver.IKPositionWeight = Mathf.MoveTowards(_ArmIK.solver.IKPositionWeight, _isFishingLeftArmEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); _ArmIK.solver.IKRotationWeight = Mathf.MoveTowards(_ArmIK.solver.IKRotationWeight, _isFishingLeftArmEnabled ? 1f : 0f, Time.deltaTime * transitionWeightTimeScale); } }