我的角色中有2个游戏对象,例如right_obj和left_obj,我希望它们忽略父级旋转,就像玩家改变方向(左,右)一样,这2个游戏对象保持其位置和旋转度,到目前为止,我使用了2个接近但失败。这是我的代码,我在两个游戏对象上使用了此脚本,但它们点燃了这一行
// first one approch
Quaternion rotation;
void Awake()
{
rotation = transform.rotation;
}
void LateUpdate ()
{
transform.rotation = rotation;
}
// 2nd approch
void LateUpdate ()
{
transform.rotation = Quaternion.identity;;
}
答案 0 :(得分:7)
您真的需要这种类型的关系吗?
如果您确实不需要父子关系,则可以在0,0,0处生成一个空的GameObject,并在场景中间生成实际的父项和子项作为GameObject的子项,这样仍然可以对它们进行分组在某种关系中,但代替父亲/孩子,您将获得兄弟/兄弟关系,使第一个与第二个独立。
如果您需要使两个对象相互依赖,而不是像父子对象那样以各种方式相互依赖,请尝试使用Parent Constraints
这样,您将获得这种类型的层次结构:
-父亲GO(从0,0,0)
-Child1(您的实际父亲)
-Child2(您的实际孩子)
Child1和Child2正在通过其ParentConstraint同步位置,但不是通过其旋转。
否则,除了对孩子应用相反的旋转,别无其他方法。
答案 1 :(得分:2)
您还可以使用旋转约束组件。这类似于上面提到的父约束,但在我看来它更容易理解 - 它只使用旋转以及您插入的任何游戏对象的旋转。
您只需要创建一个空游戏对象并将旋转设置为 0,0,0 ,然后将这个空游戏对象设置为旋转约束的源。我的游戏中有这个确切的设置,它覆盖了实际父级的旋转,这正是我想要的。
也许不是绝对最干净的解决方案,但值得考虑。
这是文档链接 - https://docs.unity3d.com/Manual/class-RotationConstraint.html
答案 2 :(得分:1)
正如@aaronrums 所说,旋转约束是实现这一目标的简单方法。
这里,我有 3 个游戏对象。包含所有子项的主父对象容器(“玩家座位”)将始终设置为在 Z 轴上旋转 0。我试图保持垂直定位的 GO(因此文本和头像不会旋转)是“DrewPlayer”。我在其父级“玩家位置”中在 X 轴上偏移了 100。我在不想旋转的项目上添加了旋转约束。 (又名“DrewPlayer”)一旦约束在它上面,我将“玩家座位”拖到源列表中,当我旋转“玩家座位”时,我能够在下面的 gif 中实现所需的效果。
谢谢@aaronrums!在这里省了我一些力气。 :)
答案 3 :(得分:0)
LeviathanCode的“父约束”解决方案仅适用于Unity 2018.1+,因为它是新增功能。
我的建议不是一个“漂亮”的解决方案,但是如果您想在模仿动作的同时避免模仿旋转,那么它也可以用于较早的版本:
摆脱父/子关系,添加一个新的父GameObject(如LeviathanCode建议)和一个脚本,该脚本可以简单地复制玩家每一帧的动作:
public GameObject player; //Drag the "player" GO here in the Inspector
public void LateUpdate() {
transform.position = player.transform.position;
}
这样,您的“ right_obj”和“ left_obj”将不会像播放器一样旋转,但仍会与之“一起移动”。