【发布时间】:2016-10-10 12:10:44
【问题描述】:
我在 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 中的 Skeleton 脚本
- “右腿骨”、“右小腿骨”等有骨骼和IK脚本
- “右腿”、“右小腿”等是精灵
- “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);
}
}
【问题讨论】:
-
您是否有理由要编写此代码而不是使用 Sprite Renderer 的 FlipX/flipY? docs.unity3d.com/ScriptReference/SpriteRenderer.html 如果你这样做,会发生同样的事情吗?您是否仔细检查了您的 IK 和极点目标(针对每个 IK 和骨骼)?
-
我不明白:我的“空手道”
GameObject上没有任何SpriteRenderer组件。我的每条肢体都有 3 个SpriteRenderer(总共 12 个)+ 一些用于躯干和头部的。例如,每个“右腿”、“右小腿”和“右脚”都有自己的SpriteRenderer。如果我翻转一个,它只会在本地翻转。我尝试在顶部的“karateka”对象上添加一个 elmpty Sprite Renderer,但没有成功。我也试过GetComponent<SpriteRenderer> ().flipX = true;。我将再次检查我所有的对象,但是,由于它在一个方向上工作,我认为它应该在两个方向上都工作。 -
看起来你真的没有翻转所有东西和/或没有正确重置骨骼。动画对我的眼睛来说太快了,但在我看来,一些骨头卡在原位并一直指向同一个方向(即没有翻转也没有移动 - 你的精灵的原点是 0 吗?)。当您从代码中执行此操作时,您还可以使用 Debug.Log 转储整个树中的所有数据,以查看“卡在”位置的内容。如果没有,那也是信息
-
你可能让我走上了正轨。骨架脚本有一个“编辑模式”复选框。当它被选中并且我使用
scale.x *= -1翻转我的角色时,我可以看到所有除了骨骼都被翻转了。所以只有精灵和 IK 目标。现在,在我的 Flip() 函数中,我只翻转了顶部的“IK”游戏对象,而且效果要好得多,除了我的精灵当然仍然在错误的方向上。我注意到 Sprites And Bones GameObject Inspector 中有一个Flip()按钮可以翻转每个精灵。我仍然无法从代码中触发它。在最坏的情况下,我将循环所有 SpriteRenderer -
我使用问题末尾的代码让它工作。您可以将其复制/粘贴到答案中,以便我接受。感谢您的宝贵时间!
标签: unity3d unity3d-2dtools unity3d-5 inverse-kinematics