95 lines
3.5 KiB
C#
95 lines
3.5 KiB
C#
|
using UnityEngine;
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
|
||
|
[RequireComponent(typeof(Animator))]
|
||
|
|
||
|
public class IKControl_Robot : MonoBehaviour
|
||
|
{
|
||
|
|
||
|
protected Animator animator;
|
||
|
|
||
|
public bool ikActive = false;
|
||
|
public Transform rightHandObj = null;
|
||
|
public Transform leftHandObj = null;
|
||
|
public Transform lookObj = null;
|
||
|
public Transform stepOnObj = null;
|
||
|
public Transform stepOffObj = null;
|
||
|
|
||
|
|
||
|
void Start()
|
||
|
{
|
||
|
animator = GetComponent<Animator>();
|
||
|
transform.Rotate(0, 90, 0);
|
||
|
}
|
||
|
|
||
|
//a callback for calculating IK
|
||
|
void OnAnimatorIK()
|
||
|
{
|
||
|
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);
|
||
|
}
|
||
|
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);
|
||
|
}
|
||
|
if(stepOnObj != null)
|
||
|
{
|
||
|
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
|
||
|
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
|
||
|
animator.SetIKPosition(AvatarIKGoal.LeftFoot,stepOnObj.position);
|
||
|
animator.SetIKRotation(AvatarIKGoal.LeftFoot,stepOnObj.rotation);
|
||
|
|
||
|
}
|
||
|
if(stepOffObj!= null) {
|
||
|
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);
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|