在 Unity 中使用反向运动学翻转 2D 角色
Flip a 2D character, using inverse kinematics, in Unity
我在 Unity 中使用 Sprites And Bones 绑定了一个 2D 角色,我使用反向运动学为其设置动画。
但是如果我想翻转 X 轴,我的角色就会发疯:
我有一个附加到 "Karateka" 的脚本,包含一个简单的 Flip()
函数:
public void Flip(){
facingRight = !facingRight;
Vector3 karatekaScale = transform.localScale;
karatekaScale.x *= -1;
transform.localScale = karatekaScale;
}
- "Karateka" 只是骨骼、精灵和 IK 目标的容器
- "Skeleton" 包含 Sprite And Bones
中的骨架脚本
- "Right leg bone"、"Right lower leg bone"等有骨骼和IK脚本
- "Right leg"、"Right lower leg"等都是精灵
- "IK" 包含所有 IK 目标
我在 Unite 2014 - 2D Best Practices In Unity 的另一个 IK 脚本 Simple CCD 中有同样的效果,所以我可能只是做了一些愚蠢的事情。
如何正确翻转我的角色?
编辑(马克):
我用它来工作:
public void Flip(){
facingRight = !facingRight;
/*
Vector3 karatekaScale = transform.localScale;
karatekaScale.x *= -1;
transform.localScale = karatekaScale;
*/
GameObject IK = GameObject.Find ("IK");
GameObject skeleton = GameObject.Find ("Skeleton");
Vector3 ikScale = IK.transform.localScale;
ikScale.x *= -1;
IK.transform.localScale = ikScale;
if (facingRight) {
skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 180.0f, skeleton.transform.localEulerAngles.z);
} else {
skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 0.0f, skeleton.transform.localEulerAngles.z);
}
}
好的,正如我们在评论中讨论的那样,总结一下:
1) 你没有翻转所有东西 and/or 没有正确重置骨骼,这就是翻转 "falls apart" 动画的原因
2) 可以做一个 SpriteRenderer
.flip[X/Y] 但这应该在 sprite
的每个元素上完成
3) 骨架脚本有一个 "Edit mode" 复选框。当它被选中并使用 scale.x *= -1
翻转角色时,可以看到除了骨头 之外的所有东西 都被翻转了
最后但并非最不重要的一点是,问题已更新为提供问题 "code level solution" 的代码片段。
感谢您分享所有详细信息 Cyrille 以及很高兴能帮上忙。
也可以只将预制件的根部(这里是空手道)在 Y 轴上旋转 180°。
2D 精灵实际上是 2 面 3D 网格,将它们在 Y 轴上旋转 180° 与翻转渲染效果相同,如果 IK 以对象的根为父级,它们将跟随旋转,并且所有动画都可以。
我在 Unity 中使用 Sprites And Bones 绑定了一个 2D 角色,我使用反向运动学为其设置动画。
但是如果我想翻转 X 轴,我的角色就会发疯:
我有一个附加到 "Karateka" 的脚本,包含一个简单的 Flip()
函数:
public void Flip(){
facingRight = !facingRight;
Vector3 karatekaScale = transform.localScale;
karatekaScale.x *= -1;
transform.localScale = karatekaScale;
}
- "Karateka" 只是骨骼、精灵和 IK 目标的容器
- "Skeleton" 包含 Sprite And Bones 中的骨架脚本
- "Right leg bone"、"Right lower leg bone"等有骨骼和IK脚本
- "Right leg"、"Right lower leg"等都是精灵
- "IK" 包含所有 IK 目标
我在 Unite 2014 - 2D Best Practices In Unity 的另一个 IK 脚本 Simple CCD 中有同样的效果,所以我可能只是做了一些愚蠢的事情。
如何正确翻转我的角色?
编辑(马克):
我用它来工作:
public void Flip(){
facingRight = !facingRight;
/*
Vector3 karatekaScale = transform.localScale;
karatekaScale.x *= -1;
transform.localScale = karatekaScale;
*/
GameObject IK = GameObject.Find ("IK");
GameObject skeleton = GameObject.Find ("Skeleton");
Vector3 ikScale = IK.transform.localScale;
ikScale.x *= -1;
IK.transform.localScale = ikScale;
if (facingRight) {
skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 180.0f, skeleton.transform.localEulerAngles.z);
} else {
skeleton.transform.localEulerAngles = new Vector3(skeleton.transform.localEulerAngles.x, 0.0f, skeleton.transform.localEulerAngles.z);
}
}
好的,正如我们在评论中讨论的那样,总结一下:
1) 你没有翻转所有东西 and/or 没有正确重置骨骼,这就是翻转 "falls apart" 动画的原因
2) 可以做一个 SpriteRenderer
.flip[X/Y] 但这应该在 sprite
的每个元素上完成
3) 骨架脚本有一个 "Edit mode" 复选框。当它被选中并使用 scale.x *= -1
翻转角色时,可以看到除了骨头 之外的所有东西 都被翻转了
最后但并非最不重要的一点是,问题已更新为提供问题 "code level solution" 的代码片段。
感谢您分享所有详细信息 Cyrille 以及很高兴能帮上忙。
也可以只将预制件的根部(这里是空手道)在 Y 轴上旋转 180°。
2D 精灵实际上是 2 面 3D 网格,将它们在 Y 轴上旋转 180° 与翻转渲染效果相同,如果 IK 以对象的根为父级,它们将跟随旋转,并且所有动画都可以。