【问题标题】:Flip a 2D character, using inverse kinematics, in Unity在 Unity 中使用反向运动学翻转 2D 角色
【发布时间】: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


【解决方案1】:

好的,正如我们在 cmets 中讨论的那样,总结一下:
1) 你没有翻转所有东西和/或没有正确重置骨骼,这就是动画在翻转时“崩溃”的原因
2) 可以做一个SpriteRenderer.flip[X/Y] 但这应该在精灵的每个元素上完成
3) 骨架脚本有一个“编辑模式”复选框。当它被选中并使用scale.x *= -1 翻转角色时,可以看到所有除了骨头都被翻转了

最后但并非最不重要的一点是,问题已通过代码 sn-p 更新,为该问题提供“代码级解决方案”。

感谢 Cyrille 分享所有细节,我很高兴我可以帮忙。

【讨论】:

    【解决方案2】:

    也可以在 Y 轴上将预制件(此处为 Karateka)的根部旋转 180°。

    2D 精灵实际上是 2 面 3D 网格,在 Y 轴上将它们旋转 180° 与翻转渲染相同,如果 IK 是对象根的父级,它们将跟随旋转,并且所有动画将起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多