更改实例化对象的父对象会更改其位置,如何将其保持在实例化位置

时间:2019-01-12 15:12:33

标签: c# unity3d

我想将一个对象实例化到给定的位置,然后将其父对象更改为另一个游戏对象,但是将实例化的对象保持在与实例化对象相同的位置。取而代之的是,该对象将其位置更改为我作为父母的对象。

我已经将这个空的GameObject应用于脚本。我将一个对象实例化到另一个空GameObject的位置,效果很好。然后,我将实例化的对象设置为另一个空GameObject的子对象,因为我想移动用作实例化位置的GameObject而不移动实例化的对象,因为我想将实例化到一个新的位置。但这失败了,我生成的对象将自己移动到第三个空GameObject的位置,我将其设置为父对象。

GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
theTile.transform.SetParent(parentObj.transform);

设置新的父对象后,实例化的对象将自身移动到父对象的位置。 我尝试了多种方法来执行此操作,但是对于我尝试过的每种方法,都在发生同一件事,实例化的对象移到了新父对象的位置。 这些是我尝试过的替代方法:

GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
theTile.transform.parent = transform.parent;

;

GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
theTile.transform.SetParent(parentObj.transform, false);

;

Vector3 originalPos = spawningZone.transform.position;
GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
theTile.transform.SetParent(parentObj.transform);
theTile.transform.position = originalPos;

3 个答案:

答案 0 :(得分:1)

GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
theTile.transform.SetParent(parentObj.transform, true);
  

public void SetParent(Transparent parent,bool worldPositionStays);

第二段应该为真。因此它将保持原样。

le.transform.position = originalPos;

答案 1 :(得分:0)

新实例化的对象的默认位置为local-0,0,0。如果您在实例化调用中为它们提供了父对象,则会在父对象的位置创建它们(如果您直到之后才对其进行父设置,则它们将在world-0,0,0处生成)。

您实际上从未对职位进行任何修改。甚至这个片段,

    Vector3 originalPos = spawningZone.transform.position;
    GameObject theTile = Instantiate(thePrefab, spawningZone.transform);
    theTile.transform.SetParent(parentObj.transform);
    theTile.transform.position = originalPos;

theTile的位置设置为与spawningZone的位置相同。

(如果您不知道,实例化预制件将忽略预制件根对象的位置和旋转)

答案 2 :(得分:0)

我发现了我的问题所在。这是我用来以网格状方式生成这些预制件的另一行代码,在我设置新的父对象后 ,我搞砸了实例化对象的本地位置。在弄乱本地位置后放上用于设置父级的代码行即可解决此问题。