C# 让孩子不受父母的影响

C# 让孩子不受父母的影响,c#,unity3d,C#,Unity3d,我在我的角色中有两个游戏对象,分别是right_obj和left_obj,我希望它们忽略父对象的旋转,比如如果玩家改变方向(左、右),这两个游戏对象将保持其位置和旋转,到目前为止,我使用了两种方法,但都失败了。这是我的代码,我在我的两个游戏对象上使用了这个脚本,但它们忽略了这一行 // first one approch Quaternion rotation; void Awake() { rotation = transform.rotation; } void LateUpdat

我在我的角色中有两个游戏对象,分别是right_obj和left_obj,我希望它们忽略父对象的旋转,比如如果玩家改变方向(左、右),这两个游戏对象将保持其位置和旋转,到目前为止,我使用了两种方法,但都失败了。这是我的代码,我在我的两个游戏对象上使用了这个脚本,但它们忽略了这一行

// first one approch
Quaternion rotation;
void Awake()
{
    rotation = transform.rotation;
}

void LateUpdate () 
{
    transform.rotation = rotation;
}

// 2nd approch
void LateUpdate () 
{
    transform.rotation = Quaternion.identity;;
}

你真的需要这种关系吗?
如果你真的不需要父子关系,你可以在0、0、0产生一个空的游戏对象,并将实际的父和子作为场景中游戏对象的孩子生成。通过这种方式,他们仍然会在某种关系中分组,但是而不是父亲/孩子,你会得到一种兄弟/兄弟关系,使第一种关系独立于第二种关系

如果您需要使两个对象相互依赖,但不是像父子关系中所设想的那样以每一种方式依赖,请尝试使用

这样,您将获得这种类型的层次结构:
-父亲走(0,0,0)
--孩子1(你的亲生父亲)
--孩子2(你的真实孩子)

Child1和Child2通过其ParentConstraint而不是旋转同步位置

否则,除了对子对象应用相反的旋转之外,没有其他方法

LeviathanCode的“父约束”解决方案仅适用于Unity 2018.1+,因为它是一个新添加的解决方案

我的建议不是一个“漂亮”的解决方案,但如果您想防止在复制运动的同时模仿旋转,它也适用于旧版本:

摆脱父/子关系,添加一个新的父游戏对象(如LeviathanCode建议的)和一个脚本,该脚本只需在每帧复制玩家的移动:

public GameObject player; //Drag the "player" GO here in the Inspector    

public void LateUpdate() {
    transform.position = player.transform.position;
}

这样,您的“右”和“左”对象就不会像玩家那样旋转,但仍会随着“玩家”移动。

您还可以使用旋转约束组件。这类似于上面提到的父约束,但在我看来更容易理解-它只使用旋转,并且只使用你插入的任何游戏对象的旋转

您只需创建一个空游戏对象并将旋转设置为0,0,0,然后将此空游戏对象设置为旋转约束的源。我在游戏中有这个精确的设置,它覆盖了实际父对象的旋转,这就是我想要的

也许不是最干净的解决方案,但这是值得考虑的问题。


这是docs链接-

正如@aaronrums所说,旋转约束是实现这一点的一种简单方法。

在这里,我有3个游戏对象。容纳所有子对象的主父对象容器(“玩家座椅”)将始终设置为Z轴上0的旋转。我试图保持垂直定位(因此文本和化身不旋转)的GO是“DrewPlayer”。我将其在父“玩家位置”的X轴上偏移100。我在不想旋转的项目上添加了旋转约束。(又称为“DrewPlayer”)一旦约束生效,我将“玩家座椅”拖到源列表,当我旋转“玩家座椅”时,我能够在下面的gif中实现所需的效果


谢谢@aaronrums!在这里为我节省了一些精力。:)

另一种方法可能是给子对象一个带有
运动学的
刚体
组件,并锁定旋转。感谢您的回复,但它不工作,它仍在移动。您可以对应用于父对象的子对象应用相反的旋转。这看起来好像孩子没有旋转。这实际上是一个很好的答案。我可以通过在我不想旋转的GO上添加旋转约束组件来设置它。但是,我希望它在旋转时“围绕”其父组件移动,基本上保持其旋转为0。这很容易让它围绕父对象旋转并保持垂直。