Как написать список кода, который связывает изображение с правильным словом? - PullRequest
2 голосов
/ 24 мая 2019

я пытаюсь устроить викторину с картинкой - основной механик игры - выбрать правильную картинку из 4 вариантов, чтобы она соответствовала данному слову.Я экспериментировал с использованием массива / списка, чтобы связать картинку со словом.но не знаю как.нужен герой, чтобы помочь мне, пожалуйста!Я очень новичок в Unity, поэтому мне просто нужно руководство:)

public class listtest : MonoBehaviour
{
    public List<GameObject> vp = new List<GameObject>();
    public List<string> word = new List<string>();
}

окончательный результат, возможно, должен по крайней мере показать соответствие пары.

1 Ответ

3 голосов
/ 24 мая 2019

Предполагая, что ваши списки находятся в правильном порядке и имеют точно такой же размер, как вы могли бы

public Dictionary<string, GameObject> ImageByString = new Dictionary<string, GameObject>();
public Dictionary<GameObject, string> StringByImage = new Dictionary<GameObject, string>();

private void Start()
{
    // at least have an "emergency" check and use the smaller list count
    var count = Mathf.Min(vp.Count, word.Count);

    for(var i = 0; i < count; i++)
    {
        ImageByString.Add(word[i], vp[i]);
        StringByImage.Add(vp[i], word[i]);
    }
}

или используя Linq

using System.Linq;

...

private void Start()
{
    ImageByString = word.Zip(vp, (k, v) => new {k, v}).ToDictionary(x => x.k, x => x.v);
    StringByImage = vp.Zip(word, (k, v) => new {k, v}).ToDictionary(x => x.k, x => x.v);
}

Однако это не будет отображаться в Unity Inspector. Если вы пытаетесь достичь этого, вам лучше реализовать собственный класс, такой как

[Serializable]
public class WordImagePair
{
    public string word;
    public GameObject vp;
}

Тогда вы должны «поверить», что все значения word уникальны, поэтому вы можете просто сделать

public List<WordImagePair> pairs = new List<WordImagePair>();

Теперь либо используйте словарь снова, как

public Dictionary<string, GameObject> ImageByString = new Dictionary<string, GameObject>();
public Dictionary<GameObject, string> StringByImage = new Dictionary<GameObject, string>();

private void Start()
{
    foreach(var pair in pairs)
    {
        ImageByString.Add(pair.word, pair.vp);
        StringByImage.Add(pair.vp, pair.word);
    }
}

или снова с Linq

private void Start()
{
    ImageByString = pairs.ToDictionary(p => p.word, p => p.vp);
    StringByImage = pairs.ToDictionary(p => p.vp, P => p.word);
}

или позже используйте Linq напрямую для доступа к таким изображениям, как

public GameObject ImageByString(string word)
{
    var output = pairs.FirstOrDefault(p => string.Equals(p.word, word));

    if(output == null)
    {
        Debug.LogErrorFormat(this, "No Image with word=\"{0}\" found!", word);
    }

    return output;
}

public string StringByImage(GameObject vp)
{
    var output = pairs.FirstOrDefault(p => p.vp == vp);

    if(output == null)
    {
        Debug.LogErrorFormat(this, "No word for given GameObject {0} found!", vp.name);
    }

    return output;
}

Примечание: напечатано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...