- Home /
Question by
FatalityGames2 · Aug 05, 2021 at 07:57 AM ·
animationscripting problemshootinggame development
Inverse Kinematic is not on position
Hey there I am working on a shooting game. but while setting up IK. I got some problems.
In this picture Ik is perfectly working. Its on point. but when i aim and go to aiming animation. This happens.
I can't understand why it is happening. is it because of Animation or IkScript.
using UnityEngine;
using StarterAssets;
public class IKHandler : MonoBehaviour
{
Animator anim;
ThirdPersonController controller;
public float lookWeight = 1f, bodyWeight = 0.8f, headWeight = 1f, clampWeight = 1f;
float targetWeight;
public Transform weaponHolder;
public Transform rightShoulder;
public Transform overrideLookTarget;
public Transform rightHandIkTarget, leftHandIKTarget;
public float rightHandIkWeight, leftHandIkWeight;
Vector3 lookPosition, lookHitPosition;
public LayerMask playerLayer;
Transform AimHelper, camTrans;
void Start()
{
AimHelper = new GameObject().transform;
anim = GetComponent<Animator>();
controller = GetComponent<ThirdPersonController>();
camTrans = Camera.main.transform;
}
void FixedUpdate()
{
if(rightShoulder == null)
{
rightShoulder = anim.GetBoneTransform(HumanBodyBones.RightShoulder);
}else
{
weaponHolder.position = rightShoulder.position;
}
if(controller.Aiming)
{
Vector3 directionTowardTarget = AimHelper.position - transform.position;
float angle = Vector3.Angle(transform.forward, directionTowardTarget);
if(angle < 90)
{
targetWeight = 1;
}else
{
targetWeight = 0;
}
}else
{
targetWeight = 0;
}
float multiplier = (controller.Aiming)?5:30;
lookWeight = Mathf.Lerp(lookWeight, targetWeight, Time.deltaTime * multiplier);
rightHandIkWeight = lookWeight;
leftHandIkWeight = 1 /*- anim.GetFloat("LeftHandIkWeight")*/;
FindWhereCameraIsLooking();
HandleShoulderRotation();
}
void HandleShoulderRotation()
{
AimHelper.position = Vector3.Lerp(AimHelper.position, lookPosition, Time.deltaTime * 5);
weaponHolder.LookAt(AimHelper.position);
rightHandIkTarget.parent.transform.LookAt(AimHelper.position);
}
void OnAnimatorIK()
{
anim.SetLookAtWeight(lookWeight, bodyWeight, headWeight, headWeight, clampWeight);
Vector3 filterDir = lookPosition;
anim.SetLookAtPosition((overrideLookTarget != null)? overrideLookTarget.position : filterDir);
if(leftHandIKTarget)
{
anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, leftHandIkWeight);
anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHandIKTarget.position);
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, leftHandIkWeight);
anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHandIKTarget.rotation);
}
if(rightHandIkTarget)
{
anim.SetIKPositionWeight(AvatarIKGoal.RightHand, rightHandIkWeight);
anim.SetIKPosition(AvatarIKGoal.RightHand, rightHandIkTarget.position);
anim.SetIKRotationWeight(AvatarIKGoal.RightHand, rightHandIkWeight);
anim.SetIKRotation(AvatarIKGoal.RightHand, rightHandIkTarget.rotation);
}
}
void FindWhereCameraIsLooking()
{
Ray ray = new Ray(camTrans.position, camTrans.forward);
lookPosition = ray.GetPoint(20);
RaycastHit hit;
Debug.DrawRay(ray.origin, ray.direction);
if(Physics.Raycast(ray.origin, ray.direction, out hit, 100, playerLayer))
{
lookHitPosition = hit.point;
}else
{
lookHitPosition = lookPosition;
}
}
}
idleik-min.png
(253.9 kB)
aimik-min.png
(169.0 kB)
Comment