Как отсортировать переменные и правильно их использовать в Unity? - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю над этим так долго, но, к сожалению, я совсем не прогрессирую.Я создаю личностную викторину в Unity, в которой у каждого вопроса есть выбор, где в зависимости от каждого выбора определенная переменная возрастает в стоимости.Тест стремится показать лучшие 5 образцов соответствия пользователя (который является переменной с самым высоким значением), основанный на его индивидуальности, которая будет основана на его ответах.Публичные пустоты вызываются в зависимости от того, какой выбор / кнопка была нажата при нажатии в инспекторе.

public class QuizScript : MonoBehaviour {

public int snake = 0;
public int centipede = 0;

public void Q2C1() //question 2 choice 1
{
    snake = snake + 1;
    Debug.Log("Snake = " + snake); //for me to see if it works
}

public void Q3C1() //question 3 choice 1
{
    centipede = centipede + 1;
    Debug.Log("Centipede = " + centipede);
}
}

Всего 26 шаблонов, но в то же время я просто хочу отсортировать две переменные, которыезмея и сороконожка.Я искал учебники о сортировке переменных и есть короткие и длинные методы.Но в любом случае, мне трудно понять это и применить его в своем коде.В одном методе требуется использовать другой публичный static void или static int для выполнения сортировки, но меня смущает то, как я смогу вызвать его внутри другого публичного void, который будет вызываться и выполняться, когда кнопканажал, что невозможно после попытки в коде.(Кроме того, public static void не распознает уже объявленные переменные внутри класса, что является большой проблемой.) Я думал о вызове static void отдельно при нажатии кнопки, которую можно увидеть в инспекторе, но, возможно, потому что этоэто статическая пустота, я не могу найти его в настройках.

Это код, в котором я не могу вызвать статический int SortByScore в инспекторе.

static int SortByScore(int snake, int centipede)
{
    return centipede.CompareTo(snake);
}

Огромное спасибо за помощь.:)

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Я думаю, что ваша стратегия на вашем пути.Это хороший пример, где вам будет лучше хранить ваши значения в HashSet или Dictionary.

Вот как будет выглядеть ваш код, если вы вместо этого будете использовать словарь:

public class QuizScript : MonoBehaviour {
  public System.Collections.Generic.Dictionary<string, int> characteristic = new Dictionary<string, int>();

  //public int snake = 0;
  //public int centipede = 0;

  //constructor initializes your set
  public QuizScript() {
        characteristic.Add("snake",0);
        characteristic.Add("centipede",0);          
  }

  public void Q2C1() //question 2 choice 1
  {
      characteristic["snake"] += 1;
      Debug.Log("Snake = " + characteristic["snake"].ToString()); //for me to see if it works
  }

  public void Q3C1() //question 3 choice 1
  {
      characteristic["centipede"] += 1;
      Debug.Log("Centipede = " + characteristic["centipede"].ToString());
  }
}
0 голосов
/ 11 декабря 2018

Я бы хотел использовать какой-то тип Dictionary для достижения этой цели.

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

public class QuizScript : MonoBehavior {
    public Dictionary<Outcome, int> Outcomes = new Dictionary<Outcome, int>() {
        { Outcome.Snake, 0 },
        { Outcome.Centipede, 0 }
    };

    public void Q2C1() {
        Outcomes[Outcome.Snake]++;

        Debug.Log("Snake: " + Outcomes[Outcome.Snake]);
    }

    public void Q3C1() {
        Outcomes[Outcome.Centipede]++;

        Debug.Log("Centipede: " + Outcomes[Outcome.Centipede]);
    }

    public Outcome GetHighestOutcome() {
        // Order by the 'key' of the dictionary, i.e. the number we tied to the outcome
        return Outcomes.OrderByDescending(choice => choice.Value).FirstOrDefault().Key;
    }
}

public enum Outcome {
    Snake,
    Centipede
}

По дополнительному запросу OP, вы можете выполнить сортировку, а затем получить верхние элементы, например, так:

public List<Outcome> GetHighestOutcome() {
    // Order by the 'key' of the dictionary, i.e. the number we tied to the outcome
    var maxValue = Outcomes.OrderByDescending(choice => choice.Value).FirstOrDefault().Value;
    var kvPairs = Outcomes.Find(kv => kv.Value == maxValue);
    return kvPairs.Select(kv => kv.Key).ToList();
}
0 голосов
/ 11 декабря 2018

Какова ваша цель в конце проекта?Вы хотите отображать переменные в порядке от самого большого до самого маленького?Если это так, вы можете загрузить все переменные в массив и позволить массиву выполнить сортировку за вас.Класс Array имеет функцию Sort ()!

Так, например, вы можете иметь массив переменных int под объявлениями других ваших переменных, затем вы можете загрузить массив со всеми вашими переменными:

variableArray = {snake, centipede, ...} //the rest of your variables

Затем используйте функцию сортировки класса Array, чтобы отсортировать ее для вас.Проверьте, как объявлять массив и как использовать функцию сортировки массива, и все должно быть готово.

Удачи!

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