选中Player对象,创建空的子对象,做六个小球,分别对应body,leftHand,rightHand,leftFoot,rightFoot,lookat,接着在AnimatorController的Base Layer中勾选IK Pass项,补选的话后面球不会动。
1)创建MyIK脚本,实现IK功能
2)在类MyIK中加入以下变量:
public Transform bodyObj=null;
public Transform leftFootObj=null;
public Transform leftHandObj=null;
public Transform rightHanddObj=null;
public Transform rightFootObj=null;
public Transform lookatObj=null;
private Animator avatar;
private bool ikActive=false;
前面六个变量是对应操作对象,avatar表示角色对象的Animator组件,ikActive表示是否勾选IK选项,在Inspector窗口将这些变量一一赋值。
在函数中Start初始化变量avatar
avatar=GetComponent<Animator>();
在函数Update中加入以下代码:
if(!ikActive)
{
if(bodyObj!=null)
{
bodyObj.position=avatar.bodyPosition;
bodyObj.rotation=avatar.bodyRotation;
}
if(leftFootObj!=null)
{
leftFootObj.position=avaatar.GetIKPosition(AvatarIKgoal.LeftFoot);
leftFootObj.rotation=avaatar.GetIKRotation(AvatarIKgoal.LeftFoot);
}
if(looatObj!=null)
{
lookatObj.position=avatar.bodyPosition+avatar.bodyRotation*new
Vector3(0,0.5f,1);
}
}
1.这是没有激活IK的状态,控制对象从avatar(角色)上获得
2.角色躯干部分的位置和旋转系数由Animator组件的bodyPosition和bodyRotation来设置
3.在设置角色左手位置时,调用dAnimator类的成员函数GetIKPosition,并指定IK目标为左脚,即AvatarIKgoal.LeftFoot。这样GetIKPosition就会返回IK目标点的旋转量,其返回的是一个Quaternion对象。
4.avatar.bodyPosition+avatar.bodyRotation*new
Vector3(0,0.5f,1);表示将球控制在颈部的控制球在角色前上方。
5.其余部位代码自行添加,一模一样
接着写激活IK的代码
在脚本添加OnAnimatorIK中加入以下代码:
void OnAnimatorIK(int layerIndex)
{
if(avatar==null) ruturn;
if(ikActive)
{
avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot,1.0f);
avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot,1.0f);//不设置的话不会动的
}
if(leftFootObj!=null)
{
avatar.SetIKPosition(AvatarIKGoal.LeftFoot,leftFootObj);
avatar.SetIKRotation(AvatarIKGoal.LeftFoot,leftFootObj);
}
if(lookatObj!=null)
{
avatar.SetlookatPosition(lookatObj.position);//视角不会旋转的所以就不用加旋转
}
}
else
{
avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot,0);
avatar.SetIKRotationnWeight(AvatarIKGoal.LeftFoot,0);
}
剩下部位代码自行添加,照着做就行。
再加个勾选IK选项的代码:
void OnGUI()
{
ikActive=GUILayout.Toggle(ikActive,"激活IK");
}
所以,使用IK功能时要用到 SetIKPositionWeight(AvatarIKGoal.LeftFoot,1); 设置权值然后再调用 SetIKPosition(AvatarIKGoal.LeftFoot,leftFootObj);
不用IK的话不用权值,接着 GetIKPosition(AvatarIKgoal.LeftFoot);
FK是父骨骼带动子骨骼,IK是子骨骼带动父骨骼。
参考Unity官方案列