如何从Unity3D中的列表中随机选择值?

时间:2017-04-26 05:56:38

标签: c# unity3d

假设我有一个Robot类列表[List<机器人> myList = new List<机器人>()]。每个机器人都有一个名称和ID,具体取决于其颜色。现在,从列表中随机选择值,并输出列表中每种颜色的机器人数量。 (N.B.认为你只有3个彩色机器人[黄色,绿色,红色])

我的代码:

Private Sub OpenPPPres_LB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim i           As Long

For i = 0 To OpenPPPres_LB.ListCount - 1
    If OpenPPPres_LB.Selected(i) Then
        PPTFileName = OpenPPPres_LB.List(i) ' <-- save the PPT filename
        Exit For
    End If
Next i

Unload UserForm1

End Sub

但这可能不起作用..实际上我不明白我的输出是什么......

2 个答案:

答案 0 :(得分:3)

您的随机选择正常(即使您的代码有点令人困惑)。我想你的问题是,你不理解Debug.Log(robot);的输出。

  

实际上我不明白我的输出是什么...... - OP

Debug.Log()打印什么?

根据Unity3D Documentation for this function将给定对象转换为字符串表示以供显示。这意味着只会打印对象上ToString()方法的返回值。

让我们看一下Object.ToString()方法及其在MSDN Documentatio n中的行为。

  

Object.ToString方法的默认实现返回对象类型的完全限定名称。 - MSDN

因此,Unity日志中的输出将是对象的类型定义

现在,如何获得有用的信息?

只需将ToString()类的默认Robot方法覆盖为以下内容:

public class Robot
{
    public string name;
    public int id;

    public Robot(string name, int id)
    {
        this.name = name;
        this.id = id;
    }

    // Here start's the magic!
    public override string ToString()
    {
        return string.Format("Robot -> Id:'{0}' Name:'{1}'", id, name);
    }
}

答案 1 :(得分:3)

不确定是否真正了解您所要求的内容:如果只是关于Debug.Log(robot);输出的含义,请检查@Smartis答案,因为它完美地回答:)

否则,我觉得您希望使用随机选择的名称填充List<Robot>。在这种情况下,您需要使用循环:Start()方法仅在启动时调用一次(顾名思义)。如果您需要使用随机选择的颜色/名称填充列表,然后显示列表中每种颜色/名称的数量,您可以按照以下步骤进行操作:

public class Test : MonoBehaviour
{
    private void Start()
    {
        List<Robot> robotsList = new List<Robot>();
        List<string> namesList = new List<string>();
        namesList.Add("yellow");
        namesList.Add("green");
        namesList.Add("red");

        PopulateRobotsList();
        DisplayRobotsListContent();
    }

    private void PopulateRobotsList()
    {
        for(int id = 0; id < 100; id++)
        {
            string robotName = namesList[Random.Range(0, namesList.Count)];
            robotsList.Add(new Robot(robotName, id));
            //Debug.Log(robotsList[robotsList.Count - 1]);
        }
    }

    private void DisplayRobotsListContent()
    {
        int[] robotsNamesCount = new int[namesList.Count];

        for (int i = 0; i < robotsList.Count; i++)
        {
            robotsNamesCount[namesList.IndexOf(robotsList[i].name)] += 1;
        }

        for (int i = 0; i < namesList.Count; i++)
        {
            Debug.Log("Robot(s) named \"" + namesList[i] + "\" : " + robotsNamesCount[i]);
        }
    }
}

public class Robot
{
    public string name;
    public int id;
    public Robot(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
}

请注意我更改了一些变量名称,因为我发现很难理解你提供的名称(例如:robotsList存储机器人的潜在颜色/名称是一个奇怪的名称选择:))

希望这有帮助,