如何在Unity中对变量进行排序并正确使用它?

时间:2018-12-11 15:38:44

标签: c# arrays sorting unity3d

我已经为此工作了很长时间,但是不幸的是,我根本没有进步。我正在Unity中创建一个个性测验,其中每个问题都有选择,其中取决于每个选择的特定变量的价值正在增加。测验试图根据用户的性格显示用户的前5个最佳拟合模式(这是具有最高价值的变量)。根据检查员在单击中单击的选择/按钮,可以调用公共空隙。

squeue -u mnyber004 -p ada --format "scancel %j" > /tmp/remove.sh
source remove.sh

总共有26种模式,但与此同时,我只想对两个变量进行排序,即蛇和the。我已经搜索了有关对变量进行排序的教程,并且有很短的方法和很长的方法。但是无论哪种方式,我都很难理解它并将其应用到我的代码中。在一种方法中,需要使用另一个公共static void或static int进行排序,但是令我感到困惑的是,我如何才能在另一个公共void中调用它,当按钮被按下时将被调用并完成。单击,在代码中尝试后将无法执行。 (此外,公共静态空无法识别类中已经声明的变量,这是一个大问题。)我曾考虑过在检查器中可以看到的单击按钮时分别调用静态空,但这可能是因为是静态空虚,我无法在选项中找到它。

这是我无法在检查器中调用static int SortByScore的代码。

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);
}
}

非常感谢您的帮助。 :)

3 个答案:

答案 0 :(得分:2)

我会考虑使用某种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();
}

答案 1 :(得分:1)

我认为您的策略正在逐步发展。这是一个很好的示例,您最好将值存储在Begin emission: Finished sending 1 packets. ..................................................................... HashSet中。

如果您改用Dictionary,这就是代码的样子:

Dictionary

答案 2 :(得分:0)

在项目结束时您的目标是什么?您要按从大到小的顺序显示变量吗?如果是这样,您可以将所有变量加载到数组中,然后让该数组为您进行排序。 Array类具有Sort()函数!

例如,您可以在其他变量声明下有一个int变量数组,然后可以将所有变量加载到该数组中:

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

然后,使用Array类的Sort函数为您对其进行排序。了解如何声明数组以及如何使用Array的Sort函数,您应该都准备就绪。

祝你好运!