2017-05-29 40 views
-1

問題是,我如何比較兩個相同類型的列表(在這種情況下是雪碧),並檢查它們是否相等。 爲了進入我的代碼,我有GameObjects符號,陰影和電纜,並用buttonclick(不同的腳本)改變它們的精靈。另一方面,我有GameObject [],並且我已經插入了GameObjects。現在我製作一個帶有GameObject的字典作爲鍵和一個特定的Sprites List作爲值,我搜索一個鍵並將該值返回到List ActualList,並將其與由GameObjects符號,陰影,電纜的當前精靈組成的List進行比較。 我的問題是,它沒有將RigidBody應用於GameObject,所以if語句似乎不起作用。是否有其他方式來比較兩個列表。我如何檢查2個列表是否具有相同的精靈C#

using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using UnityEngine; 
using UnityEngine.UI; 
public class Rigi : MonoBehaviour 
{ 
    public GameObject[] Akkus; 
    public Button Generator; 
    public GameObject symbol, shadow, cable; 
    int count1; 
    public Sprite[] spriteSymbols, spriteShadows, spriteCables; 
    public Dictionary<GameObject, List<Sprite>> AkkuDic = new 
Dictionary<GameObject, List<Sprite>>(); 
    public List<Sprite> ActualList = new List<Sprite>(); 
    public void On_Click_Button1() 
    { 

     List<Sprite> CompareList = new List<Sprite>(); 
     CompareList.Add(symbol.GetComponent<SpriteRenderer>().sprite); 
     CompareList.Add(shadow.GetComponent<SpriteRenderer>().sprite); 
     CompareList.Add(cable.GetComponent<SpriteRenderer>().sprite); 

     AkkuDic.TryGetValue(Akkus[count1], out ActualList); 

     if(ActualList.SequenceEqual(CompareList)) 
     { 
      Rigidbody RigidbodyGameobject = 
Akkus[count1].AddComponent<Rigidbody>(); 

     } 
    } 

    public void Awake() 
    { 
     List<Sprite> mySpritesWind = new List<Sprite>(); 
     mySpritesWind.Add(spriteSymbols[5]); 
     mySpritesWind.Add(spriteShadows[0]); 
     mySpritesWind.Add(spriteCables[0]); 
     List<Sprite> mySpritesOel = new List<Sprite>(); 
     mySpritesOel.Add(spriteSymbols[4]); 
     mySpritesOel.Add(spriteShadows[2]); 
     mySpritesOel.Add(spriteCables[1]); 
     List<Sprite> mySpritesWasser = new List<Sprite>(); 
     mySpritesWind.Add(spriteSymbols[5]); 
     mySpritesWind.Add(spriteShadows[0]); 
     mySpritesWind.Add(spriteCables[0]); 
     List<Sprite> mySpritesSolar = new List<Sprite>(); 
     mySpritesWind.Add(spriteSymbols[3]); 
     mySpritesWind.Add(spriteShadows[5]); 
     mySpritesWind.Add(spriteCables[0]); 
     List<Sprite> mySpritesKern = new List<Sprite>(); 
     mySpritesWind.Add(spriteSymbols[1]); 
     mySpritesWind.Add(spriteShadows[1]); 
     mySpritesWind.Add(spriteCables[1]); 
     List<Sprite> mySpritesKohle = new List<Sprite>(); 
     mySpritesWind.Add(spriteSymbols[2]); 
     mySpritesWind.Add(spriteShadows[4]); 
     mySpritesWind.Add(spriteCables[1]); 

     AkkuDic.Add(Akkus[0], mySpritesWind); 
     AkkuDic.Add(Akkus[1], mySpritesOel); 
     AkkuDic.Add(Akkus[2], mySpritesWasser); 
     AkkuDic.Add(Akkus[3], mySpritesSolar); 
     AkkuDic.Add(Akkus[4], mySpritesKern); 
     AkkuDic.Add(Akkus[5], mySpritesKohle); 

    } 
} 

回答

0

在SequenceEqual使用將要檢查的默認比較,以查看是否雪碧在CompareList類實例的引用指針是相同的「內存引用指針」作爲存儲在ActualList。沒有看到這個完整的生命週期,我們不能確定,但​​如果GetComponent()創建了Sprite類的新實例,則代碼將無法按預期工作。如果我記得Unity,它可能會創建一個新實例或返回一個緩存實例。

我希望您需要比較列表之間的某些屬性(如AssetID或其他唯一的精靈值),而不是列表引用指針本身;特別是如果你沒有完全控制應用程序中的Sprite類生命歷史,並且你正在使用某人工廠(即GetComponent)

+0

那麼我應該將AssetID添加到字典中的列表中,是否有辦法將一個.GetComponent ()。sprite轉換爲一個AssetID,所以我可以將它們與這些進行比較,因爲如果這樣做的話,這很可能是答案 –

+0

我認爲Unity有一個GetInstanceID()函數,它獲取唯一的對象引用(https://docs.unity3d.com/ScriptReference/Object.GetInstanceID.html)。 – PhillipH

相關問題