C# 如何将列表中的项目添加到GenericMenu(编辑器窗口),并且只能选择一个

C# 如何将列表中的项目添加到GenericMenu(编辑器窗口),并且只能选择一个,c#,unity3d,unity-editor,C#,Unity3d,Unity Editor,我使用UnityDior图书馆在Unity工作。我制作了一个自定义编辑器窗口,我正在填充OnGui中的空白。我创建了一个列表,其中包含git存储库中所有分支名称的字符串版本,如下所示 void OnGUI() { Process checkbranch = new Process(); if (GUILayout.Button("Show Branches")) { checkbranch.StartInfo.FileName = "git";

我使用UnityDior图书馆在Unity工作。我制作了一个自定义编辑器窗口,我正在填充OnGui中的空白。我创建了一个列表,其中包含git存储库中所有分支名称的字符串版本,如下所示

void OnGUI()
{
    Process checkbranch = new Process();
    if (GUILayout.Button("Show Branches"))
    {
        checkbranch.StartInfo.FileName = "git";
        checkbranch.StartInfo.Arguments = "branch";
        checkbranch.StartInfo.UseShellExecute = false;
        checkbranch.Start();
        checkbranch.WaitForExit();

        Branches.Clear();
        string branch;
        branch = checkbranch.StandardOutput.ReadLine();
        while (!string.IsNullOrEmpty(branch))
        {
           var m = new CheckBranch();
           m.BranchName = branch;
           Branches.Add(m);

           branch = checkbranch.StandardOutput.ReadLine();
         }
     }
}

public class CheckBranch
{
     public string BranchName;
     public bool BranchBool;
}
现在我正在尝试将这些分支添加到通用菜单中,这样会有一个下拉菜单,您可以在其中选择要切换到的分支。因此,基于该语句,这意味着您只能从通用菜单中选择一个分支

然后我尝试将它们添加到菜单中,但在这里它开始不起作用

private void OnGui()
{
...
if (GUILayout.Button("test"))
        {
            GenericMenu menu = new GenericMenu();
            for (int i = 0; i < Branches.Count; i++)
            { 
                menu.AddItem(new GUIContent(Branches[i].BranchName), Branches[i].BranchBool, Toggle); 
            }
            menu.ShowAsContext();
        }
}
void Toggle()
    {
        Process p = new Process();

        for (int i = 0; i < Branches.Count; i++)
        {
            Branches[i].BranchBool = true;
            p.StartInfo.FileName = "git";
            p.StartInfo.Arguments = $"checkout {Branches[i].BranchName}"; // menu function
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.UseShellExecute = false;
            p.Start();
            p.WaitForExit();
        }
    }

因此,当我选择一个分支时,它会选择所有分支,我如何处理这些分支

这是unity的照片


请帮忙。

我想试试更像组合框的东西。听起来和你要找的一模一样

在GUI布局中尝试以下操作:

string[] options = new string[movParamsListSize];
        for (int i = 0; i < movParamsListSize; i++)
            options[i] = i.ToString();
movStepToMoveTo.intValue = EditorGUILayout.Popup("movementStepToMoveTo",
      movStepToMoveTo.intValue, options, EditorStyles.popup);
这就像一个组合框,其中包含在选项字符串[]中指定的选项。 请参阅MovementStepToMoveToField,它是一个序列化属性:


希望这是有用的。

然后您可以通过将其包装在EditorGUI.BeginChangeCheck;中来增强它。。。。ifEditorGUI.EndChangeCheck{检查新索引并在此处执行操作}编辑器样式有点多余。默认情况下,弹出窗口已经是一个弹出窗口;我也会把它作为一个列表,以便添加和删除项目,然后做选择。ToArray@derHugo如何从列表中创建它?@crimson如前所述,像往常一样使用列表添加和删除项目,然后使用options.ToArray;以便仅在需要它作为数组时将其转换为数组