从父项中删除后,GameObject位置在世界空间中发生变化

时间:2016-07-25 19:53:24

标签: c# unity3d

我正在与Unity合作,我正在制造一个敌人放下他的武器。武器的向量(在局部空间中)是(0,0,1 .71),我使用以下函数:

void SetGunDrop()
{
    gun.SetParent (null);
    gun.GetComponent<Animator> ().enabled = false;
    Rigidbody rb = gun.GetComponent<Rigidbody> ();
    rb.isKinematic = false;
}

然而,在从父母分离后,武器会在世界位置中转换为(0,0,1.71),从敌人身体转换到地图的中心。

有没有办法避免这种情况,并使枪从其位置直接落到地上?

2 个答案:

答案 0 :(得分:0)

我建议将枪变换的父级设置为null或者设置为世界空间的变换,然后将GameObject的X / Y / Z变换值添加到变换的X / Y / Z.

void SetGunDrop() {
   var parentT = gun.parent.transform;
   gun.SetParent (null);
   gun.position += new Vector(parentT.x, parentT.y, parentT.z); 
   gun.GetComponent<Animator> ().enabled = false;
   Rigidbody rb = gun.GetComponent<Rigidbody> ();
   rb.isKinematic = false;
}

如果您想了解有关Transform.SetParent()的更多信息,请查看Unity的文档here。有关移动Unity变换的更多信息,请参阅post。祝你好运!

编辑:更新以反映枪变量是变换游戏对象:)

答案 1 :(得分:0)

解决此问题的一种简单方法是在放下枪之前存储枪的世界位置。

void SetGunDrop()
{
    Vector3 tempPosition = gun.position;
    gun.SetParent (null);
    gun.position = tempPosition;

    gun.GetComponent<Animator> ().enabled = false;
    Rigidbody rb = gun.GetComponent<Rigidbody> ();
    rb.isKinematic = false;
}

这对你有用,祝你好运!