如果list包含4个给定的gameObjects

时间:2017-09-10 10:39:30

标签: c# unity2d

我试图找到如何检查4个给定的游戏对象是否在列表中。 所以我有一个gameObjects列表。有时游戏对象会从列表中删除,有时它会进入。我想检查列表中是否有4个相同的颜色。在这种情况下,“childTiles”是列表。 我这样做了尝试:

void Update()
{
    foreach (GameObject tile in ChildTiles) 
    {
        if (tile.gameObject.name == "tileGreen1" && tile.gameObject.name == "tileGreen2" && tile.gameObject.name == "tileGreen3" && tile.gameObject.name == "tileGreen4") 
        {
            gameManager.finalGreenComplete = true;
            Debug.Log (gameManager.finalGreenComplete);
        }
    }
}

这不会返回任何内容。如果我只检查一个对象,它确实有效。我也不能使用ChildTiles.Contains(),因为如果我是对的,那只能用1个gameObject。那么如何用多个游戏对象来检查呢?

编辑:更多信息。

我有4种不同的颜色,每种颜色有4个瓷砖。每当玩家点击一个按钮时,父母将随着瓷砖一样旋转。孩子自动成为特定父母的孩子。父母是碰撞者(在白色游戏对象下方的图像中是碰撞器。它们通常没有精灵渲染器),它位于按下的按钮后面。灰色圆圈是按钮。

https://i.gyazo.com/38fcf90e6bebe43763f5d358dd19f093.png

以下脚本附加到所有白色对撞机上。公共虚空Squareclicked附加到每个按钮,但它在同一个脚本中。

public List<GameObject> ChildTiles = new List<GameObject>();

public void SquareClicked()
{
    if (parentPositions.canTurn == true && gameManager.turns > 0f)
        {
        gameManager.turns -= 1;
        gameManager.turnsText.text = "Turns: " + gameManager.turns;
        foreach(GameObject go in ParentPositions)
        {
            parentPositions = go.GetComponent<TileController> ();
            parentPositions.canTurn = false;
        }

        foreach(GameObject tile in ChildTiles)
        {
            tile.transform.parent = gameObject.transform;
        }
        StartCoroutine(Rotate()); //this is where you do the rotation of the parent object.

        if (gameManager.turns == 0f) 
        {
            gameManager.turnsText.text = "No turns left";
        }
    }
}


void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.tag == "Tile") 
    {
        ChildTiles.Add (col.gameObject);
    }
}

void OnTriggerExit2D(Collider2D col)
{
    if (col.gameObject.tag == "Tile") 
    {
        ChildTiles.Remove (col.gameObject);
    }
}

只需要左上角,右上角,左下角和右下角的对撞机来检查它的列表中是否有四个相同的颜色。我可以创建一个新脚本并将其附加到那些碰撞器(gameObjects),或者我可以创建它以便脚本仅适用于那些。

2 个答案:

答案 0 :(得分:0)

条件肯定永远不会成立,因为对于给定的tiletile.gameObject.name有一些给定的字符串值,并且您正在检查每个磁贴都有四个名称。

如果我正确理解了这个问题,您想在ChildTiles内检查一下GameObject .gameObject.name"tileGreen1""tileGreen2" var names = ChildTiles.Select(tile => tile.gameObject.name); var shouldBeContained = new List<string> { "tileGreen1", "tileGreen2", "tileGreen3", "tileGreen4" }; bool condition = shouldBeContained.All(names.Contains); }, 等等。如果是这样,如果性能不重要,您可以按如下方式检查写入条件:

-> channel(HIDDEN)

答案 1 :(得分:0)

在此处回答您的解释如何使用枚举颜色的请求: 我没有团结,所以我无法保证这会有效,但无论如何。

首先,定义你的枚举:

int instanceID = RoleEnvironment.CurrentRoleInstance.Id;

接下来从GameObject继承一个Tile对象(或者你想用作基类的任何东西),并为它添加一个颜色属性。使用这些而不是GameObject作为ChildTiles的类型。

public enum Color
{
    Black,
    Green,
    Blue,
    Yellow,
    ///...
}

然后你的Update函数应该是这样的:

public class Tile : GameObject
{
    public Color Color { get; private set; }
    public Tile(Color color) :base()
    {
        Color = color;
    }
}