【问题标题】:GameObject doesnt allow more than one childGameObject 不允许超过一个孩子
【发布时间】:2017-09-05 17:12:48
【问题描述】:

所以基本上我想将一堆孩子添加到游戏对象中。父游戏对象称为SnakeHead,而所有其他游戏对象称为SnakeBodyParts

public class GameController : MonoBehaviour {
    public GameObject snakeHead;
    public GameObject snakeBodyPart;
    public List<GameObject> snakeBodyParts;

    void Start() {
        snakeBodyParts = new List<GameObject>();
        Instantiate<GameObject>(snakeHead);

        for (int i = 0; i < 4; i++)
        {
            var newObj = Instantiate<GameObject>(snakeBodyPart);
            newObj.transform.position = new Vector3(snakeHead.transform.position.x, snakeHead.transform.position.y - (i + 1), 0);
            newObj.transform.SetParent(snakeHead.transform);
            snakeBodyParts.Add(newObj);
        }
    }
}

所以看起来snakeHead.transform.childCount; 是 1。谁能向我解释这种行为? SnakeHeadSnakeBodyPart 都是一个简单的 Sphere,作为 3D 对象添加到我的项目中。

【问题讨论】:

  • 当你在调试器中运行这个并暂停时,你能在编辑器中看到其他的孩子吗?
  • 你能告诉我你在哪里打电话给.childcount
  • @SandyGifford 除了 SnakeHead,我还看到了 5 个其他游戏对象(SnakeBodyPart 的原件和 4 个克隆)。所以奇怪的是,snakeBodyParts 的原件是 SnakeHead 的子代,而我在这个 for 循环中实例化的所有克隆都不是。
  • @ryemoss 就在 for 循环之后。
  • 看起来您正在使用蛇头作为可实例化的预制件,但在实例化后从未保存对它的引用 (Instantiate&lt;GameObject&gt;(snakeHead);)。您是否使用库中的预制件在编辑器中设置了蛇头?还是与游戏世界中的一个对象?

标签: c# unity3d


【解决方案1】:

我假设 snakeHeadsnakeBodyPart 都是预制件。

问题是您正在使用蛇头预制件而不是实例化的 snakeHead 设置 snakeBodyPart 的父级。

当你实例化snakeHead时,你应该将它存储到一个临时变量中,用它来设置每个实例化的snakeBodyPart(newObj)的父级。

Instantiate&lt;GameObject&gt;(snakeHead) 应该是GameObject snakeHaedObj = Instantiate&lt;GameObject&gt;(snakeHead); 然后您可以稍后执行snakeHaedObj .transform.childCount; 来检查计数并将每个snakeBodyPart 的父级设置为newObj.transform.SetParent(snakeHaedObj.transform);

类似这样的:

public GameObject snakeHead;
public GameObject snakeBodyPart;
public List<GameObject> snakeBodyParts;

GameObject snakeHaedObj;

void Start()
{
    snakeBodyParts = new List<GameObject>();
    snakeHaedObj = Instantiate<GameObject>(snakeHead);

    for (int i = 0; i < 4; i++)
    {
        var newObj = Instantiate<GameObject>(snakeBodyPart);
        newObj.transform.position = new Vector3(snakeHead.transform.position.x, snakeHead.transform.position.y - (i + 1), 0);
        newObj.transform.SetParent(snakeHaedObj.transform);
        snakeBodyParts.Add(newObj);
    }
}

请注意,childCount 只会返回直接子代,而不是子代下的对象。请查看this 帖子了解如何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多