【问题标题】:GameObject is finded as active when it's not active in the hierarchy当游戏对象在层次结构中不活动时,它被认为是活动的
【发布时间】:2018-01-25 11:07:30
【问题描述】:

所以我构建了一个名为 Obstacles 的自定义类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Obstacle{

    public GameObject gameObj;
    public Color color;

    public GameObject[] particleEffects;

    public static Vector3 SpawnLocation()
    {
        int positionQuadran = Random.Range(1, 3);
        switch (positionQuadran)
        {
            //spawn above the player
            case 1:
                 return new Vector3(Random.Range(1.5f, -1.5f),
                                                      Random.Range(4f - SpawnStars.closerToPlayer, 4.5f),
                                                      Random.Range(1, -3.2f));
            //spawn benith the player
            case 2:
                return new Vector3(Random.Range(1.5f, -1.5f),
                                                      Random.Range(-0.5f, SpawnStars.closerToPlayer),
                                                      Random.Range(1f, -3.2f));
        }
        return Vector3.zero;
    }
}

接下来我创建了一个包含 6 个对象的池,每两个对象具有相同的颜色,因此 obstaclePool 中有 3 种不同的颜色

问题是我试图找到不活动的Obstacle,它适用于第一个有颜色的对象,但是当我结束所有颜色并再次遍历循环时,它说Obstacle.gameObj 是在层次结构中处于活动状态,我不明白,每个 Obstacle.gameObj 都处于非活动状态(因为我在 start() 中将它们设置为处于非活动状态,所以每个障碍物都应该有一个处于非活动状态的 Obstacle.gameObj 但是在我激活第一个 Obstacle.gameObj 之后下一个似乎不存在,循环“发现”只有处于活动状态的gameObj,并假设列表中的每个对象现在都是活动的,实际上只有前 3 个处于活动状态,其余 3 个不活动......而且我不明白为什么...为什么代码没有发现剩余的gameObj 处于非活动状态?

foreach (Obstacle star in obstaclePool)
{
    if (!star.gameObj.activeInHierarchy)
    {
        Color color = star.color;
        color.a = 0.5f;
        panel.GetComponent<Renderer>().material.color = color; 
        return star;
    }
}

【问题讨论】:

  • 您在哪里/何时使用 foreach?
  • 在 Start() 中{}

标签: c# list unity3d


【解决方案1】:

所以我最终弄明白了: 因此,如果我创建一个像 Obstacle 这样的服装类,我需要确保如果该类具有像 GameObject 这样的变量或需要实例化或分配的东西,我会这样做 这就是我最终解决问题的方法:

        Obstacle go = new Obstacle
        {
            gameObj = Instantiate(prefab.gameObj)
        };
        poolList.Add(go);

所以我们从字面上创建了一个新对象Obstacle,然后我们让它的 gameObj 变量等于 Instantiate(prefab.gameObj),这样我们就创建了障碍的每个部分。

【讨论】:

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