左侧截图处于播放模式,中间截图不是,所以没有IK。 源代码(改编自统一示例):
void OnAnimatorIK(int layerIndex) {
float aim = 1f;
if (layerIndex == 0) {
if (player != null) {
Vector3 target = player.transform.GetChild(0).position + Vector3.up;
animator.SetLookAtPosition(target);
animator.SetLookAtWeight(aim, 0.5f, 0.5f, 0.0f, 0.5f);
}
}
if (layerIndex == 1) {
if (leftHandOnGunPosition != null) {
animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandOnGunPosition.transform.position);
animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandOnGunPosition.transform.rotation);
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, aim);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, aim);
}
if (rightHandOnGunPosition != null) {
animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandOnGunPosition.transform.position);
animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandOnGunPosition.transform.rotation);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, aim);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, aim);
}
}
}
谁能告诉我我做错了什么?
更新: 我只是注意到右手比左手更向前。就像枪上的位置一样。为了测试,我换出了手的目标位置,然后左边是右手的前方。所以它肯定会试图将手移到正确的位置......只是没有完全到达那里。
UPDATE2: 我也尝试关闭lookat东西(if(layerIndex == 0))中的所有内容,只是为了确保不会搞砸任何东西。没有区别,除了不再看球员。
答案 0 :(得分:1)
好吧,似乎问题在于,当我添加模型时,它与它所处的导航相比太高了。所以我在navmeshagent和模型之间制作了一个儿童游戏对象,并给它ay为-1。 / p>
我可以通过将+ Vector3.up
添加到IK位置来临时修复IK。
正确的解决办法是删除y--1之间的子项,然后将navmeshagent中的基本偏移从1更改为0.