所以我有一个列表,其中我将gameObjects与特定的标签和名称放在一起。我需要知道列表是否包含同一对象的多个副本。
我想出的解决方案可能过于复杂而且不好,但现在是:
让我们说我需要知道列表是否包含此游戏对象的3个副本。我会有一个for循环,我将检查列表是否包含此对象(名称,标签等),我会将此对象放入临时变量,而不是从列表中销毁(删除)此对象,然后继续检查列表是否包含另一个和第3个gameObject。
所有都将被分配给唯一变量,如果我愿意,例如,只找到2个副本,我会将这些被破坏的对象添加回列表,当然,停止循环。
我希望这是可以理解的
答案 0 :(得分:2)
这很棘手但可以在Dictionary
上循环List
时完成。
这是该怎么做:
1 。创建Dictionary
来保存对象。 键应该是Object的类型。就我而言,我将使用GameObject
。 值应为int
。该int将表示GameObject
中出现List
的次数。
2 。覆盖包含要检查的所有游戏对象的列表。
3 。在每个循环中,检查字典中是否存在#2 中当前循环的Object。
如果它存在于字典中,将检索该值,然后将其递增1
。如果字典中不存在,将当前GameObject添加到值为1
的字典中。
4 。最后,通过将目标特定金额(3
)与字典中的值进行比较,检查我们是否已达到字典中的x金额。打破循环这是真的,否则继续循环直到结束。
以上所有内容都转换为函数。有关详细信息,请参阅评论:
bool listConstainsSpecificObjCount(List<GameObject> targetObjList, GameObject targetObj, int appearedCount)
{
bool containsSpecificObjCount = false;
//1 Dictionary to hold the object found in each loop
Dictionary<GameObject, int> tempDic = new Dictionary<GameObject, int>();
//2 Loop over the targetObjList
for (int i = 0; i < targetObjList.Count; i++)
{
//Current Object in the Loop
GameObject currentDicObj = targetObjList[i];
int dicResult = 0;
//3 Check if the Object from the current loop exist in the dictionary
if (tempDic.TryGetValue(currentDicObj, out dicResult))
{
//It exists, increment the count by 1
dicResult++;
//Update data/value in the existing Dictionary
tempDic[currentDicObj] = dicResult;
}
else
{
//Use 1 for the value because we are about to add it to the Dictionary
dicResult = 1;
//Add current Object to the Dictionary for the first time
tempDic.Add(currentDicObj, dicResult);
}
//4 Check if we have reached that x amount in the dictionray then break out of the loop
if (dicResult >= appearedCount)
{
containsSpecificObjCount = true;
break;
}
}
return containsSpecificObjCount;
}
<强> USAGE 强>:
//The list of the Objects to check if they appeared x amount of time
public List<GameObject> testList;
//The specific Object to check
public GameObject objToCheck;
//The X amount of time it should check if it appeared
int specificCount = 3;
void Start()
{
bool result = listConstainsSpecificObjCount(testList, objToCheck, specificCount);
Debug.Log(result);
}
如果您想改进此功能,请将Dictionary<GameObject, int> tempDic = new Dictionary<GameObject, int>();
移到该功能之外,以便每次调用时都会创建新的Dictionary
。使用tempDic.Clear();
清除该函数开头的字典。