如何在Unity中找出实例化的预制子对象的数量?

时间:2019-07-05 22:56:01

标签: c# unity3d

我有2个对象:

  • 瓷砖:只有一个矩形平面
  • 条纹:瓷砖的集合

在GameManager脚本中,我每2秒实例化一个条纹,在Stripe脚本中,我使用带有随机数的for循环实例化Tiles,并将它们作为刚创建的条纹的父元素。

我的问题是我想找出每个实例化的Stripe的瓦片数量?

我的意思是使用newStripe.transform.childCount无效,因为它将始终返回零,并且仅出于测试原因,我通过添加一个空游戏对象来编辑Stripe预制件,然后应用更改newStripe.transform.childCount将返回1

我知道我应该在这种情况下使用对象池技术,但是我是一个初学者,我正在尝试学习。

// GameManager Script

void Update()
{
    timeBetweenSpawns -= Time.deltaTime;

    if (timeBetweenSpawns < -2)
    {           
       Stripe newStripe = Instantiate(stripePrefab, spawnPosition, 
       Quaternion.identity);

        // This variable (tilesCountIntStripe) always returns zero
        tilesCountInStripe = newStripe.transform.childCount;

        timeBetweenSpawns = 0;
    }
}

// Stripe Script
void Update()
{
    if (createTile)
    {
        int randomStripesCount = Random.Range(1, 10);
        for (int i = 0; i < randomStripesCount; i++)
        {
            Tile newTile = Instantiate(tile);
            newTile.transform.SetParent(transform, true);
            newTile.transform.localPosition = new Vector2(transform.position.x, (-i * (1.1f)));
            tilesCount += 1;
        }
        createTile = false;
    }
}

1 个答案:

答案 0 :(得分:0)

由于0尚未运行,它会返回您正在询问的Tile::Update()

如果您希望该代码立即运行,我建议您执行以下操作:

// GameManager Script

void Update()
{
    timeBetweenSpawns -= Time.deltaTime;

    if (timeBetweenSpawns < -2)
    {           
       Stripe newStripe = Instantiate(stripePrefab, spawnPosition, 
         Quaternion.identity);

       tilesCountInStripe = newStripe.GetComponent<Stripe>().Init();
       //Or whatever the exact name of your class is ^ here

       timeBetweenSpawns = 0;
    }
}

// Stripe Script
public int Init()
{
    int randomStripesCount = Random.Range(1, 10);
    for (int i = 0; i < randomStripesCount; i++)
    {
        Tile newTile = Instantiate(tile);
        newTile.transform.SetParent(transform, true);
        newTile.transform.localPosition = new Vector2(transform.position.x, (-i * (1.1f)));
        tilesCount += 1;
    }
    return randomStripesCount;
}

更改:

  1. 我们无需等待Update创建磁贴,而是在Init函数中实例化它们,该函数从您控制的代码中调用。
    • 这也消除了使用createTile字段来防止更新代码(每帧运行一次)在每个帧中运行的必要性。
      • 这应该是您在错误的地方做事的线索
  2. 通过此Init方法(FAST)返回随机数的图块,而不必查询变换层次结构(SLOW)。