提前感谢您的帮助。以下是我遇到问题的代码的简短片段。
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);
}
这也消除了保持所有泵事件控制器的阵列的需要。 现在脚本一切正常。它可能效率不高,但它正在发挥作用。
再次感谢所有有帮助的人。
答案 0 :(得分:0)
根据您发布的代码,问题在于damaged
属性永远不会重置。一旦你将它添加到列表中,一个解决方案就是重置这个属性,如下所示:
if(motor.GetComponent<Pump_event>().damaged)
{
motor.GetComponent<Pump_event>().damaged = false;
BrokenMotor_list.Add(motor);
}
但是,如果电机再次损坏,同一对象的多个副本仍可添加到列表中。
要解决此问题,您可以使用HashSet
。哈希集只允许对象的一个副本存在于其中,因此,如果对象已经存在则不会再次添加。
需要注意的是,您需要覆盖GetHashCode
类的Equals
和GameObject
方法,因为哈希集将在内部使用这些方法将项目置于其中并识别重复。
答案 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);
}
通过添加委托,您最好在发生损坏事件后执行此操作。