[英]Looping through 2 arrays (Unity3d)
玩家資源和所需資源遵循類似的模式;
public struct RequiredResources
{
public Resource resource;
public int quantityRequired;
}
public class Resource : ScriptableObject
{
[SerializeField]
private string resourceName;
public string GetName() { return resourceName; }
[SerializeField]
public Sprite icon;
public Sprite GetIcon() { return icon; }
}
可供玩家使用的資源如下; 食物、黃金、木材、石頭
我希望使用這樣的系統,以便我可以根據需要輕松添加更多資源。 放置建築物時,它會列出建造它所需的資源,例如房屋可能需要花費; 金 = 5 木材 = 3
使用下面的代碼,這將遍歷資源並根據需要減少數量。 基本上是玩家擁有的數量 - 成本,然后更新 UI。
public void UseResources()
{
foreach (RequiredResources requiredResources in building.GetResources())
{
foreach (ResourceManager.PlayersResources resource in player.playersResources)
{
if (requiredResources.resource.Equals(resource.GetResourceType()))
{
resource.RemoveQuantity(requiredResources.quantityRequired);
}
}
}
}
但是,在運行之前,我想檢查玩家是否有足夠的資源。 當我使用類似的邏輯返回 true 和 false,並且玩家有足夠的木材(true)但沒有足夠的金幣(false)時,它將刪除兩者的數量。 我對正確執行此操作的方法感到茫然。
public bool HasRequiredResources(RequiredResources[] requiredResources)
{
foreach (RequiredResources r in requiredResources) //go through all required resources
{
foreach (PlayersResources p in playersResources)
{
if (r.quantityRequired > p.GetCurrAmount())
Debug.Log("Has enough " + r.resource.name);
return false;
}
}
return true; //reaching this point means that the faction has all required resources
}
這就是我所擁有的,但它總是返回 false,我哪里出錯了? 我相信這是由於foreach內部的foreach。 但是如何運行第二個 (PlayersResources) 列表的搜索以返回相同的資源?
我相信您的錯誤是因為您沒有在 if 子句中包含 return 語句。 所以foreach 總是返回false。 作為最佳實踐,您應該始終在 if 語句中使用大括號。 這將為您節省數小時的調試時間。 嘗試這個...
foreach (PlayersResources p in playersResources)
{
if (r.quantityRequired > p.GetCurrAmount())
{
Debug.Log("Has enough " + r.resource.name);
return false;
}
}
不明白 Debug.Log 邏輯雖然...
看起來您的內部 foreach 循環沒有檢查兩個資源是否相同。 例如,當所需資源只有 5 個木材時,您正在檢查用戶是否有 5 個金幣。
在第二個 foreach 循環中添加一個 if 語句來檢查,可能類似於if (p.resourceName == r.resource.name) { ...
您還可以嘗試使用 LINQ 語法。 我不確定您班級中字段的名稱,但似乎這樣的事情對您有用:
return requiredResources.All(r =>
playersResources.Any(p => r.resource.resourceName == p.resource.resourceName &&
r.quantityRequired > p.GetCurrAmount())
);
基本上,這意味着:如果對於 requiredResources 中的每個 r,playersResource 中至少有一個 p 與 r 具有相同的資源名稱並且具有足夠的數量,則返回 true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.