2023-05-31 17:12:43 +02:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
[RequireComponent(typeof(Animator))]
|
|
|
|
public class IKControl_Robot : MonoBehaviour
|
|
|
|
{
|
2023-06-01 17:03:48 +02:00
|
|
|
public bool ikActive;
|
|
|
|
public Transform rightHandObj;
|
|
|
|
public Transform leftHandObj;
|
|
|
|
public Transform lookObj;
|
|
|
|
public Transform stepOnObj;
|
|
|
|
public Transform stepOffObj;
|
2023-05-31 17:12:43 +02:00
|
|
|
|
|
|
|
protected Animator animator;
|
|
|
|
|
|
|
|
|
2023-06-01 17:03:48 +02:00
|
|
|
private void Start()
|
2023-05-31 17:12:43 +02:00
|
|
|
{
|
|
|
|
animator = GetComponent<Animator>();
|
|
|
|
transform.Rotate(0, 90, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
//a callback for calculating IK
|
2023-06-01 17:03:48 +02:00
|
|
|
private void OnAnimatorIK()
|
2023-05-31 17:12:43 +02:00
|
|
|
{
|
|
|
|
if (animator)
|
|
|
|
{
|
|
|
|
//if the IK is active, set the position and rotation directly to the goal.
|
|
|
|
if (ikActive)
|
|
|
|
{
|
|
|
|
// Set the look target position, if one has been assigned
|
|
|
|
if (lookObj != null)
|
|
|
|
{
|
|
|
|
animator.SetLookAtWeight(1);
|
|
|
|
animator.SetLookAtPosition(lookObj.position);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the right hand target position and rotation, if one has been assigned
|
|
|
|
if (rightHandObj != null)
|
|
|
|
{
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
|
|
|
|
animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
|
|
|
|
animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
|
|
|
|
}
|
2023-06-01 17:03:48 +02:00
|
|
|
|
2023-05-31 17:12:43 +02:00
|
|
|
if (leftHandObj != null)
|
|
|
|
{
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
|
|
|
|
animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandObj.position);
|
|
|
|
animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandObj.rotation);
|
|
|
|
}
|
2023-06-01 17:03:48 +02:00
|
|
|
|
|
|
|
if (stepOnObj != null)
|
2023-05-31 17:12:43 +02:00
|
|
|
{
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
|
2023-06-01 17:03:48 +02:00
|
|
|
animator.SetIKPosition(AvatarIKGoal.LeftFoot, stepOnObj.position);
|
|
|
|
animator.SetIKRotation(AvatarIKGoal.LeftFoot, stepOnObj.rotation);
|
2023-05-31 17:12:43 +02:00
|
|
|
}
|
2023-06-01 17:03:48 +02:00
|
|
|
|
|
|
|
if (stepOffObj != null)
|
|
|
|
{
|
2023-05-31 17:12:43 +02:00
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
|
|
|
|
animator.SetIKPosition(AvatarIKGoal.RightFoot, stepOffObj.position);
|
|
|
|
animator.SetIKRotation(AvatarIKGoal.RightFoot, stepOffObj.rotation);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//if the IK is not active, set the position and rotation of the hand and head back to the original position
|
|
|
|
else
|
|
|
|
{
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 0);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 0);
|
|
|
|
|
|
|
|
animator.SetLookAtWeight(0);
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 0);
|
|
|
|
|
|
|
|
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 0);
|
|
|
|
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|