This repository has been archived on 2023-09-13. You can view files and clone it, but cannot push or open issues or pull requests.
station_obscurum_unity/Assets/Scripts/Enemies/Robot/IKControl_Robot.cs

88 lines
3.4 KiB
C#
Raw Normal View History

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);
}
}
}
}