【问题标题】:How to swap out child of a gameobject in Unity?如何在 Unity 中换出游戏对象的子对象?
【发布时间】:2019-10-23 09:18:56
【问题描述】:

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

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

这是我试过的。我的想法是为玩家实例化一个孩子,然后以某种方式移除 Gun 孩子并将新枪放在相同的位置。火点已经是我的新预制件的一个孩子。所以我只需要交换这两个。下面的脚本将被添加到地面上。

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);
        }
    }


}

有什么想法可以从这里开始吗?非常感谢任何形式的反馈。

【问题讨论】:

  • 如果我没听错的话我想知道...只需通过Destroy(GameObject.Find("Player").transform.GetChild(0)); 删除您的孩子,然后实例化并将您的新枪设置为孩子
  • UnityScript != C#。这是 C#。

标签: c# unity3d game-development


【解决方案1】:

您不需要找到 Player 游戏对象,因为碰撞已经检测到它,并且您可以获取要替换的枪的位置以用作新枪的位置:

void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.name == "Player")
    {
        Vector3 spawnPosition = col.transform.GetChild(0).position;
        Destroy(col.transform.GetChild(0).gameObject);
        Instantiate(launcher, spawnPosition, Quaternion.identity, col.transform);
        Destroy(gameObject);
    }
}

【讨论】:

  • 我实际上无法删除 Gun 对象。我尝试了代码,它没有删除枪对象。拾取和放置完美。有什么想法吗?
  • 我得到的错误是:无法破坏“枪”的变换组件。如果您想销毁游戏对象,请改为在游戏对象上调用“Destroy”。不允许销毁转换组件。
  • 我通过 Destroy(col.transform.GetChild(0).gameObject); 解决了这部分错误然而,新问题是多枪拾取。当我拿起另一支枪时,第一个孩子被删除(在这种情况下它将进行地面检查)。所以我需要将第一个孩子设置为当前拿起的枪。此外,由于某种原因,有两个拿起枪的实例。有什么想法吗?
  • 编辑:通过手动将 gunprefab 设置为第一个孩子来解决。再次感谢!
【解决方案2】:

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

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

【讨论】:

  • 这不起作用,因为它不会删除已经存在的枪子。接送方面工作正常。
  • 在实例化if(transform.Find ("gun"))Destroy (transform.Find ("gun").gameObject); // player already has gun in child之前添加这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多