Unity C#循环一些文本而不重复它们

时间:2018-09-03 15:33:43

标签: c# random

我在游戏主屏幕的底部有一行,每次加载场景时,它都会显示不同的提示(如何播放,如何更改音乐...)。

问题是我正在使用Random.Range,但老实说,我更喜欢一种显示所有提示的方式,以一种随机的方式一个接一个地显示,但不重复其中的任何一个。

我的代码如下:

int randNum;
void Start () {
    randNum = Random.Range(0,5);
}

void Update () {

    switch (randNum)
    {
        case 0:
       // blah, blah, blah...
        case 1...

我如何实现自己想要的?

感谢您的时间:)

3 个答案:

答案 0 :(得分:3)

您可以删除switch语句并将每条消息存储在列表中。

var tips = new List<string>();
tips.Add("The clouds are white");
...

然后,您可以将列表中的元素随机化(有关here的更多信息),并逐个显示提示。您所需要做的就是跟踪索引。示例:

// This needs to be a field.
int index = 0;

void ShowTip() 
{ 
    // TODO: make sure index is not equal or greater than tips.Count

    tip = tips[index]; 
    index++; 

    // Display the tip
}

答案 1 :(得分:1)

您可以做的是随机整理小费清单。 Fisher-Yates洗牌是最常见的洗牌之一。

ExternalProject_Add(eigen
        GIT_REPOSITORY https://github.com/eigenteam/eigen-git-mirror.git
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
        GIT_SHALLOW 1)

输出

static Random _random = new Random();

static void Shuffle<T>(T[] array)
{
    int n = array.Length;
    for (int i = 0; i < n; i++)
    {
        // Use Next on random instance with an argument.
        // ... The argument is an exclusive bound.
        //     So we will not go past the end of the array.
        int r = i + _random.Next(n - i);
        T t = array[r];
        array[r] = array[i];
        array[i] = t;
    }
}

public static void Main()
{
        string[] array = { "tip 1", "tip 2", "tip 3" };
        Shuffle(array);
        foreach (string value in array)
        {
            Console.WriteLine(value);
        }
}

source

答案 2 :(得分:1)

假设您的消息与您的随机类以及最初为空的其他字符串列表一起存储在全局级别声明的字符串列表中

List<string> needToDisplayMessages = new List<string>();
List<string> base_messages = new List<string>{"message1","message2","message3","message4","message5"};
Random rnd = new Random();

在更新方法中,检查要显示的消息列表是否为空,如果是,则将列表中的消息与预定义的消息一起复制。现在,使用随机实例选择要显示的消息的索引,并从动态列表中获取它。最后,从仍要显示的消息列表中删除该消息。

void Update () {

    // We refill the list if it is empty
    if(needToDisplayMessages.Count == 0)
        needToDisplayMessages.AddRange(base_messages);

    // Choose a random number topped by the count of messages still to be displayed
    int index = rnd.Next(0, needToDisplayMessages.Count);

    string message = needToDisplayMessages[index];
    ..... display the message someway .....

    // Remove the message from the list
    needToDisplayMessages.RemoveAt(index);

}

当然,如果要按顺序显示消息,则不需要这样做,而(如已说明的)只是索引。但是,如果您想随机选择一条消息,直到显示所有消息,然后重新开始循环,那么这种方法可能并不太复杂。