根据游戏对象的颜色维护游戏对象的实时列表

时间:2017-07-15 05:14:11

标签: c# unity3d unity5

我有两个白色精灵游戏对象。一个是红色,另一个是绿色,使用Sprite渲染器中的颜色选择器。 RGB值与下面代码中的值相同。两者都有标记'对象'。

我有3个列表需要在游戏过程中不断更新 - totalObjects,redObjects& greenObjects,包含各自的游戏对象。我可以填充totalObjects,但不能填充其他两个。

这是代码 -

public List<GameObject> totalObjects = new List <GameObject>();         
public List<GameObject> redObjects = new List <GameObject>();
public List<GameObject> greenObjects = new List <GameObject>();

private Color red = new Color (0.9f, 0.5f, 0.5f, 1.0f); 
private Color green = new Color (0.8f, 0.8f, 0.3f, 1.0f); 

void Awake()
    {
        totalObjects.AddRange (GameObject.FindGameObjectsWithTag("object"));

        foreach (GameObject x in totalObjects)
        {
            if (x.GetComponent<SpriteRenderer>().color == red)
            {   
                redObjects.Add(x);
            }
            else if (x.GetComponent<SpriteRenderer>().color == green)
            {
                greenObjects.Add(x);
            }
        }
    }

void Update () 
    {
        totalObjects.RemoveAll(GameObject => GameObject == null);
        redObjects.RemoveAll(GameObject => GameObject == null);
        greenObjects.RemoveAll(GameObject => GameObject == null);
    }

此外,如果玩家通过OnTriggerEnter2D进入特定区域,则游戏过程中的颜色可能会发生变化(红色&gt;绿色&反之亦然)。如何更新列表中的这些更改?

1 个答案:

答案 0 :(得分:0)

1)看看这个主题:Compare two Color objects

  

“要仅根据其ARGB值比较颜色,您应该使用   ToArgb方法。这是因为Equals and Equality成员   使用不仅仅是ARGB值来确定等效性   颜色。例如,不考虑Black和FromArgb(0,0,0)   相等,因为黑色是命名颜色而FromArgb(0,0,0)不是“

2)如果你有颜色变化的触发器,为什么你不在触发器处理程序中控制列表中的对象?它会更有效。 特别是如果你要在创建对象和“杀死”对象时添加一些处理程序。

3)也许你应该在Awake()方法中再次填充它们时清除列表,即使你在if之前调用Update()方法? 您在更新中删除“死”对象并再次添加到列表“生活”对象。 看来你会在列表中得到被公开的对象。