Как получить все значения из объекта JSON для системы рекордов - PullRequest
0 голосов
/ 06 января 2019

Я искал вокруг, пытаясь найти полуприличный способ сделать это. По сути, у меня есть объект JSON с именем BeginnerNicknameScores. Он содержит строковые ключи nickname и соответствующие значения score.

Я использую пространство имен SimpleJSON, поскольку оно использовалось в учебном пособии, но я, конечно, могу изменить пространство имен и настроить свой код в соответствии с

По сути, моя цель здесь - получить все значения score из объекта JSON, отсортировать их по 5 лучшим показателям и отобразить их в виде текста.

public void DisplayBeginnerHighscores()
    {
        //declare top 5 interger variables
        int one = 0;
        int two = 0;
        int three = 0;
        int four = 0;
        int five = 0;

        //BeginnerNicknameScores is the JSON Object
        //BeginnerNicknameScores.Values is an emerator contraining all the [scores] value
        //Thus I use MoveNext() to check all the values, then sort them into top five using the if statements
        while (Highscore.BeginnerNicknameScores.Values.MoveNext())
        {
            if(Highscore.BeginnerNicknameScores.Values.Current > one)
            {
                one = Highscore.BeginnerNicknameScores.Values.Current;
                BegNum1.text = one.ToString();
            }
            else if(Highscore.BeginnerNicknameScores.Values.Current > two)
            {
                two = Highscore.BeginnerNicknameScores.Values.Current;
                BegNum2.text = two.ToString();
            }
            else if (Highscore.BeginnerNicknameScores.Values.Current > three)
            {
                three = Highscore.BeginnerNicknameScores.Values.Current;
                BegNum3.text = three.ToString();
            }
            else if (Highscore.BeginnerNicknameScores.Values.Current > four)
            {
                four = Highscore.BeginnerNicknameScores.Values.Current;
                BegNum4.text = four.ToString();
            }
            else if (Highscore.BeginnerNicknameScores.Values.Current > five)
            {
                five = Highscore.BeginnerNicknameScores.Values.Current;
                BegNum5.text = five.ToString();
            }
        }      
    }

Дело в том, что я, должно быть, делаю что-то не так, потому что всякий раз, когда я загружаю объект, содержащий этот скрипт, и, таким образом, вызываю эту функцию, мой Unity Engine падает.

Если у кого-нибудь есть какие-либо предложения относительно другого пути решения этой проблемы, я определенно буду признателен. Возможно, стоит отметить, что если одна из оценок разделена на пятерку лучших, мне также нужно будет отобразить ассоциированные псевдонимы каждой оценки в моем меню рекордов.

1 Ответ

0 голосов
/ 07 января 2019

А как насчет следующего?

using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private void Start()
    {
        var scores = new List<Score>
        {
            new Score("Bart", 100),
            new Score("Maggie", 75),
            new Score("Lisa", 50),
            new Score("Marge", 25),
            new Score("Homer", 0)
        };

        var table = new ScoreTable(scores);

        // save to JSON
        var json = JsonUtility.ToJson(table, true);

        // load from JSON
        var fromJson = JsonUtility.FromJson<ScoreTable>(json);

        // print the top 3 players

        var take = fromJson.Scores.OrderByDescending(s => s.Points).Take(3);

        foreach (var score in take)
            Debug.Log($"{score.Name}: {score.Points}");
    }
}

[Serializable]
public class ScoreTable
{
    public List<Score> Scores = new List<Score>();

    public ScoreTable()
    {
        // for serializer
    }

    public ScoreTable([NotNull] List<Score> scores)
    {
        if (scores == null)
            throw new ArgumentNullException(nameof(scores));

        Scores = scores;
    }
}

[Serializable]
public class Score
{
    public string Name;
    public int Points;

    public Score()
    {
        // for serializer
    }

    public Score(string name, int points)
    {
        Name = name;
        Points = points;
    }
}

Сгенерированный JSON:

{
    "Scores": [
        {
            "Name": "Bart",
            "Points": 100
        },
        {
            "Name": "Maggie",
            "Points": 75
        },
        {
            "Name": "Lisa",
            "Points": 50
        },
        {
            "Name": "Marge",
            "Points": 25
        },
        {
            "Name": "Homer",
            "Points": 0
        }
    ]
}

Лучшие 3 игрока:

enter image description here

Нет необходимости в необычной внешней библиотеке, только в Unity:)

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