移动左脚的控制球
移动控制头部运动的控制球
public class MyIK : MonoBehaviour {
//目标点位置,即各个控制球的位置
public Transform bodyObj;
public Transform leftFootObj;
public Transform rightFootObj;
public Transform leftHandObj;
public Transform rightHandObj;
public Transform lookAtObj;
private Animator avatar;
public bool ikActive = false;
// Use this for initialization
void Start () {
avatar = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (!ikActive)//未激活IK,控制球的位置从avatar上获得
{
if (bodyObj != null)
{
bodyObj.position = avatar.bodyPosition;//躯干部分的位置和旋转系数由Amnimator组件的bodyPosition和bodyRotation控制
bodyObj.rotation = avatar.bodyRotation;
}
if (leftFootObj != null)
{
leftFootObj.position = avatar.GetIKPosition(AvatarIKGoal.LeftFoot);
leftFootObj.rotation = avatar.GetIKRotation(AvatarIKGoal.LeftFoot);
}
if (lookAtObj != null)
{
lookAtObj.position = avatar.bodyPosition + avatar.bodyRotation * new Vector3(0, 0.5f, 1f);
}
}
}
private void OnAnimatorIK(int layerIndex)
{
if (avatar == null) return;
if (ikActive)
{
avatar.SetLookAtWeight(1.0f, 0.3f, 0.6f, 1.0f, 0.5f);//头部IK 设置IK权重
avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
if (bodyObj != null)
{
avatar.bodyPosition = bodyObj.position;
avatar.bodyRotation = bodyObj.rotation;
}
if (lookAtObj != null)
{
avatar.SetLookAtPosition(lookAtObj.position);//设置IK目标位置
}
if (leftFootObj != null)
{
avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position);
avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation);
}
else
{
avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 0);
avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 0);
avatar.SetLookAtWeight(0.0f);
}
}
}
}