我一直在努力寻找解决方案,但是遇到了麻烦,因此任何建议都非常感谢。
现在,我有一个列表,该列表用于使用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#的新手。
答案 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();
}