问题是,如何比较两个相同类型的列表(在本例中为Sprite)并检查它们是否相等。 为了进入我的代码,我有GameObjects符号,阴影和电缆,然后用buttonclick(不同的脚本)更改他们的精灵。另一方面,我有GameObject [],我已经插入了GameObjects。现在我创建一个以GameObject为关键字和一个特定的精灵列表作为值的字典,我搜索一个键并将值返回到List ActualList,并将其与由GameObjects符号,阴影,电缆的当前精灵组成的List进行比较。 我的问题是它没有将RigidBody应用于GameObject,所以if语句似乎不起作用。可能有不同的方法来比较两个列表。
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 :(得分:0)
SequenceEqual中使用的默认比较器将检查CompareList中Sprite的类实例的引用指针是否与存储在ActualList中的“内存引用指针”相同。在没有看到完整生命周期的情况下我们无法确定,但如果GetComponent()创建了Sprite类的新实例,则代码将无法按预期工作。如果我记得Unity,它可能会创建一个新实例或返回一个缓存的实例。
我希望你需要在列表之间比较一些属性(比如AssetID或精灵的其他唯一值),没有列表引用指针本身;特别是如果你没有完全控制应用程序中的Sprite类生活历史,并且你正在使用别人工厂(即GetComponent)