C# 如何在Unity中交换游戏对象的子对象?

C# 如何在Unity中交换游戏对象的子对象?,c#,unity3d,game-development,C#,Unity3d,Game Development,我希望我的玩家捡起一把掉落的枪预制件,然后用旧枪换一把新枪。当前结构如下所示: 所以我的想法是我的玩家在地上捡起预制件: 这就是我所尝试的。我的想法是给玩家实例化一个孩子,然后以某种方式移除枪孩子,并将新枪放在相同的位置。火点已经是我新预制屋的孩子了。所以我只需要交换这两个。下面的脚本将添加到drop on The ground中 public class WeaponPickUp : MonoBehaviour { public GameObject launcher;

我希望我的玩家捡起一把掉落的枪预制件,然后用旧枪换一把新枪。当前结构如下所示:

所以我的想法是我的玩家在地上捡起预制件:

这就是我所尝试的。我的想法是给玩家实例化一个孩子,然后以某种方式移除枪孩子,并将新枪放在相同的位置。火点已经是我新预制屋的孩子了。所以我只需要交换这两个。下面的脚本将添加到drop on The ground中

public class WeaponPickUp : MonoBehaviour
{

    public GameObject launcher;

    // Start is called before the first frame update
    void Start()
    {


    }

    // Update is called once per frame
    void Update()
    {

    }

    void  OnCollisionEnter2D(Collision2D col){
         if(col.gameObject.name =="Player"){

            GameObject go = Instantiate(launcher, new Vector3(0,0,0), Quaternion.identity) as GameObject;
            go.transform.parent = GameObject.Find("Player").transform;
            Destroy(gameObject);
        }
    }


}

有什么想法吗?我非常感谢您的任何反馈。

您不需要找到玩家游戏对象,因为碰撞已经检测到它,您可以获得要更换的枪的位置,以用作新枪的位置:

无效OnCollisionInter2D(Collision2D列)
{
如果(col.gameObject.name==“玩家”)
{
Vector3 spawnPosition=col.transform.GetChild(0.position);
销毁(col.transform.GetChild(0.gameObject);
实例化(启动器、产卵位置、四元数标识、列变换);
摧毁(游戏对象);
}
}

您不需要找到玩家游戏对象,因为碰撞已经检测到它,您可以获得要更换的枪的位置,以用作新枪的位置:

无效OnCollisionInter2D(Collision2D列)
{
如果(col.gameObject.name==“玩家”)
{
Vector3 spawnPosition=col.transform.GetChild(0.position);
销毁(col.transform.GetChild(0.gameObject);
实例化(启动器、产卵位置、四元数标识、列变换);
摧毁(游戏对象);
}
}

将脚本附加到播放机。在场景视图中,调整枪的位置,并制作预制件

  public GameObject gunPrefab;
     void  OnCollisionEnter2D(Collision2D col){
        if(col.gameObject.name =="gun"){
           Instantiate(gunPrefab, transform); //Instantiate(prefab, parent);
           Destroy(col.gameObject);
        }
}

将脚本附加到播放机。在场景视图中,调整枪的位置,并制作预制件

  public GameObject gunPrefab;
     void  OnCollisionEnter2D(Collision2D col){
        if(col.gameObject.name =="gun"){
           Instantiate(gunPrefab, transform); //Instantiate(prefab, parent);
           Destroy(col.gameObject);
        }
}

Idk如果我没弄错的话。。。只需通过
Destroy(GameObject.Find(“Player”).transform.GetChild(0))删除您的孩子然后实例化并将新枪设置为子枪!=C#。我是C#Idk如果我没弄错的话。。。只需通过
Destroy(GameObject.Find(“Player”).transform.GetChild(0))删除您的孩子然后实例化并将新枪设置为子枪!=C#。这是C#。我实际上无法删除枪对象。我试过密码,但它没有删除枪的对象。拾取和放置工作非常完美。有什么想法吗?我得到的错误是:不能破坏“枪”的变换组件。如果您想销毁游戏对象,请改为在游戏对象上调用“销毁”。不允许销毁转换组件。我通过销毁(col.transform.GetChild(0.gameObject))解决了这部分错误;然而,新的问题是多枪拾取。当我拿起另一把枪时,第一个孩子就被删除了(在这种情况下,它将进行地面检查)。因此,我需要将第一个孩子设置为当前拾取的枪。此外,由于某些原因,有两个实例是拾起的枪。有什么想法吗?编辑:通过手动将gunpreafa设置为第一个子项来解决。再次感谢!我实际上无法删除枪的对象。我试过密码,但它没有删除枪的对象。拾取和放置工作非常完美。有什么想法吗?我得到的错误是:不能破坏“枪”的变换组件。如果您想销毁游戏对象,请改为在游戏对象上调用“销毁”。不允许销毁转换组件。我通过销毁(col.transform.GetChild(0.gameObject))解决了这部分错误;然而,新的问题是多枪拾取。当我拿起另一把枪时,第一个孩子就被删除了(在这种情况下,它将进行地面检查)。因此,我需要将第一个孩子设置为当前拾取的枪。此外,由于某些原因,有两个实例是拾起的枪。有什么想法吗?编辑:通过手动将gunpreafa设置为第一个子项来解决。再次感谢!这不起作用,因为它不会删除已经存在的枪子对象。拾取方面工作正常。在实例化
if(transform.Find(“gun”))Destroy(transform.Find(“gun”).gameObject);//玩家的子项中已经有枪
这不起作用,因为它不会删除已经存在的枪子项。拾取方面工作正常。在实例化
if(transform.Find(“gun”))Destroy(transform.Find(“gun”).gameObject);//玩家的孩子身上已经有枪了