-1

问题是,我如何比较两个相同类型的列表(在本例中为 Sprite)并检查它们是否相等。要进入我的代码,我有 GameObjects 符号、阴影和电缆,它们通过按钮单击(不同的脚本)改变它们的精灵。另一方面,我有 GameObject[] 并且我已经插入了 GameObjects。现在我制作了一个字典,其中 GameObject 作为键,特定的 Sprite 列表作为值,我搜索一个键并将值返回到 List 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);

    }
}
4

1 回答 1

0

SequenceEqual 中使用的默认比较器将检查 CompareList 中 Sprite 类实例的引用指针是否与存储在 ActualList 中的“内存引用指针”相同。如果没有看到它的完整生命周期,我们无法确定,但是如果 GetComponent() 曾经创建 Sprite 类的新实例,您的代码将无法按预期工作。如果我记得 Unity,它可能会创建一个新实例或返回一个缓存实例。

我希望您需要比较列表之间的某些属性(如 AssetID 或精灵的其他唯一值),而不是列表引用指针本身;特别是如果您无法完全控制应用程序中的 Sprite 类生命历史并且您正在使用其他人的工厂(即 GetComponent)

于 2017-05-29T16:33:35.783 回答