Как проверить, имеют ли 2 списка одинаковые спрайты в C#
Вопрос в том, как сравнить два списка одного типа (в данном случае Sprite) и проверить, равны ли они. Чтобы попасть в мой код, у меня есть символ GameObjects, тень и кабель, и они меняют свой спрайт нажатием кнопки (другой скрипт). С другой стороны, у меня есть GameObject[], и у меня уже есть GameObjects. Теперь я создаю словарь с GameObject в качестве ключа и определенным списком спрайтов в качестве значения, я ищу ключ и возвращаю значение в список ActualList и сравниваю его со списком, состоящим из текущих спрайтов символа GameObjects, тени, кабеля. Моя проблема в том, что он не применяет 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);
}
}
1 ответ
Компаратор по умолчанию, используемый в SequenceEqual, проверит, является ли указатель ссылки экземпляра класса Sprite в CompareList тем же "указателем ссылки памяти", который хранится в ActualList. Не видя полного жизненного цикла этого, мы не можем быть уверены, но если GetComponent() когда-либо создаст новый экземпляр класса Sprite, ваш код не будет работать должным образом. Если я помню Unity, он вполне может создать новый экземпляр или вернуть кэшированный экземпляр.
Я ожидаю, что вам нужно сравнить какое-либо свойство (например, AssetID или другое уникальное значение спрайта) между списками, а не сами указатели на список ссылок; особенно если у вас нет полного контроля над историей жизни класса Sprite в приложении, и вы используете чью-то другую фабрику (например, GetComponent)