如何保存使用Random.Range显示的答案字符串并链接至成就

时间:2018-09-29 04:51:00

标签: c# list unity3d

我一直在努力寻找解决方案,但是遇到了麻烦,因此任何建议都非常感谢。

现在,我有一个列表,该列表用于使用Random.Range向用户随机显示列表中的字符串。但是,这些答案没有被记录或保存,因此用户无法知道他们已经解锁了多少答案。

这就是我现在拥有的:

List<string> allLocations = new List<string>();

allLocations.Insert(0, "Answer 1");
allLocations.Insert(1, "Answer 2");
allLocations.Insert(2, "Answer 3");

 // Display random answer from list

string displayAnswer = allLocations[Random.Range(0, allLocations.Count)];

我想实现一种方法来记录每个显示的字符串(如果以前没有显示给用户),然后根据不同的类别将其分类在列表中(或更合适的选项)。

例如,如果显示字符串“答案1”或“答案2”中的任何一个,并且之前未显示给用户,它将被记录并计为成就类别A中解锁的一个答案。如果字符串“ Answer 3”是首次显示给用户,它将被视为类别B中解锁的一个答案。

理想情况下,我将能够对这些未锁定的答案字符串进行排序,以便用户可以看到在每个类别中已解锁的答案数量。这些未解开的答案中有101串,可分为10个类别来实现。

如何实现此目的,并使显示成就的脚本可以访问先前显示给用户的字符串记录?我读到JSON数据序列化比PlayerPrefs更好,但是我不确定如何实现这一点。

谢谢!如果这是一个愚蠢的问题,我事先表示歉意。我真的是Unity和C#的新手。

1 个答案:

答案 0 :(得分:0)

您可以封装有关视图计数/类别的数据,并以通用方式使用这些集合。例如,您可以使用以下行为:

public class Answer
{
    public string Text;
    public string Category;
    public int ViewsCount;
}

public class AnswersCollection
{
    private readonly List<Answer> _answers = new List<Answer>();

    /// <summary>
    /// to init data
    /// </summary>
    public void AddAnswer(string text, string category)
    {
        _answers.Add(new Answer {Text = text, Category = category, ViewsCount = 0});
    }


    public string GetNoViewedRandomAnswer(bool setViewed = true)
    {
        var some = _answers.Where(a => a.ViewsCount == 0)
            .OrderBy(_ => Guid.NewGuid()) // to randomize collection ordering
            .FirstOrDefault();
        if (some != null && setViewed) some.ViewsCount++;
        return some.Text;
    }

    public string[] GetViewedCategories() =>
        _answers.Where(a => a.ViewsCount > 0).Select(a => a.Category).ToArray();

    public string[] GetViewedAnswers() =>
        _answers.Where(a => a.ViewsCount > 0).Select(a => a.Text).ToArray();

    public System.Tuple<string, string>[] GetViewedAnswersWithCategory() =>
        _answers.Where(a => a.ViewsCount > 0).Select(a => Tuple.Create(a.Text, a.Category)).ToArray();
}