簡體   English   中英

循環遍歷 2 個數組 (Unity3d)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM