Unity3d:从数组中添加gameobject到List

时间:2015-07-15 08:01:04

标签: c# arrays list unity3d

提前感谢您的帮助。以下是我遇到问题的代码的简短片段。

GameObject[] allMotor_array;
public List<GameObject> BrokenMotor_list = new List<GameObject>();
void Start()
{
   allMotor_array = GameObject.FindGameObjectsWithTag ("Motors");
}

void Update()
{        
    foreach (GameObject motor in allMotor_array)
    {
        if(motor.GetComponent<Pump_event>().damaged)
        {
            BrokenMotor_list.Add(motor);
        }
    }

}

我有一个在Start上创建的Gameobjects数组,数组中的每个游戏对象都有一个名为Pump_event的脚本。我想要做的是将带有真正布尔值(损坏)的游戏对象添加到列表中,以便我可以创建所有损坏的电机的GUI列表(然后对这些电机采取进一步操作)。

使用当前代码,它可以很好地实例化数组,但是当其中一个电机布尔值变为true时,列表会在每个更新周期中不断地将电机游戏对象添加到列表中。所以我想要的是找出一种方法将游戏对象添加到列表ONCE。

将它放在update()中可能不是最好的方法,但我真的很难理解如何处理它。

<小时/> 解决我的问题

感谢您的回答,您都有充分考虑过的答案。我很感激。我没有采用1人方法,而是采用了适用于我的脚本的逻辑方法。

这就是我所做的。 在我的pump_event脚本中,事件在Case中切换,并且当事件升级时泵上的损坏增加。因此,我在该脚本的一个部分中添加了“报告”损坏的内容。

public class Pump_event : MonoBehaviour 
//The damage has taken place and event_category=0\\
switch (event_category) 
    {
    case 0:
        Master_script.GetComponent<Control_room>().AddtoList (gameObject);
        event_category = 1;
        break;

我接受了建议,不要插入这些类型的编程,并将其放入单独的类中,这样做得很好。

public class Master_script: MonoBehaviour 
public void AddtoList(GameObject motor_tobadded)
{
    BrokenMotor_list.Add(motor_tobadded);
} 

这也消除了保持所有泵事件控制器的阵列的需要。 现在脚本一切正常。它可能效率不高,但它正在发挥作用。

再次感谢所有有帮助的人。

3 个答案:

答案 0 :(得分:0)

根据您发布的代码,问题在于damaged属性永远不会重置。一旦你将它添加到列表中,一个解决方案就是重置这个属性,如下所示:

    if(motor.GetComponent<Pump_event>().damaged)
    {
        motor.GetComponent<Pump_event>().damaged = false;
        BrokenMotor_list.Add(motor);
    }

但是,如果电机再次损坏,同一对象的多个副本仍可添加到列表中。

要解决此问题,您可以使用HashSet。哈希集只允许对象的一个​​副本存在于其中,因此,如果对象已经存在则不会再次添加。

需要注意的是,您需要覆盖GetHashCode类的EqualsGameObject方法,因为哈希集将在内部使用这些方法将项目置于其中并识别重复。

答案 1 :(得分:0)

检查列表是否已包含电机。

if(motor.GetComponent<Pump_event>().damaged)
    {
        if(BrokenMotor_list.Contains(motor))
        { 
           BrokenMotor_list.Add(motor);
        }
    }

虽然在msdn上描述了如果你想要比较不同的对象(具有不同的引用),如何实现IEquatable https://msdn.microsoft.com/ru-ru/library/vstudio/bhkz42b3%28v=vs.100%29.aspx

答案 2 :(得分:-1)

if (!BrokenMotor_list.Contains (motor)) {
    BrokenMotor_list.Add (motor);
}

通过添加委托,您最好在发生损坏事件后执行此操作。