改变窗口布局与GUILayout.按钮在Unity &c#

本文关键字:Unity 按钮 GUILayout 窗口 布局 改变 | 更新日期: 2023-09-27 18:16:23

我试图在Unity中使用GUILayout按钮(和开始/结束垂直/水平等)制作菜单,我想让它,当我点击一个按钮,某些信息显示在它下面。我试着用下面的代码来做:

foreach (Agent Agent in agents)//(Agent Agent in EntityManager.FindAll()){

    //GUILayout.BeginHorizontal();
    if (GUILayout.Button(agent.shortName))
    {
            Debug.Log("clicked" + agent.shortName);
        GUILayout.BeginHorizontal();
        GUILayout.BeginVertical();
        GUILayout.Label("Health: "+agent.Health +"/"+agent.MaximumHealth);
        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        GUILayout.BeginVertical();
        GUILayout.Label("Thoughts: nothing");
        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        /*if (agent.hasFlag)
        { //TODO: Add this function to agent
            GUILayout.BeginVertical();
            GUILayout.Label("Has the flag");        
            GUILayout.EndVertical();
        }*/
    }
        //GUILayout.EndHorizontal();
    }
    GUILayout.EndHorizontal();
    GUILayout.EndVertical();

    // Make the windows be draggable.
    GUI.DragWindow();

这成功地创建了3个按钮(因为我在foreach循环中使用的代理列表中有3个代理)并且按钮工作(这就是添加Debug.Log代码的原因)。但是,我添加的东西(比如标签)都不会在单击按钮时出现。做我想做的事情的正确方法是什么?

改变窗口布局与GUILayout.按钮在Unity &c#

不太确定统一。但似乎没有一个事件为点击。似乎是你唯一的影响GUI布局没有调用和事件。如果你需要使标签出现或改变布局时,一个按钮被点击,我建议。

  1. 首先我会创建一个包含标签布局的新函数,这应该在gui类中,但在unity中,我理解您只需将脚本附加到向导创建的对象?
  2. 第二,我会为你的按钮创建一个事件处理程序,所以说按钮1?public button1_onClick(事件处理程序属性go hear)
  3. 最后,我将简单地调用事件处理程序方法中的标签布局方法公共button1_onclick () {Label1layout ();}

就像这样。虽然我不确定你是这个意思。

在unity gui中,按钮点击的代码包含在按钮的if语句中。

if(GUILayout.Button("Button Text"))
{ 
    // code for click event goes here
}

这段代码只在按钮被按下的那一帧被调用,因此,在上面的例子中,您只在1帧内显示您单击的代理的详细信息。

你需要把它改成

if (GUILayout.Button(agent.shortName))
{
    agent.selected = true;
}
if(agent.selected)
{
    Debug.Log("clicked" + agent.shortName);
    GUILayout.BeginHorizontal();
    GUILayout.BeginVertical();
    GUILayout.Label("Health: "+agent.Health +"/"+agent.MaximumHealth);
    GUILayout.EndVertical();
    GUILayout.EndHorizontal();
    GUILayout.BeginHorizontal();
    GUILayout.BeginVertical();
    GUILayout.Label("Thoughts: nothing");
    GUILayout.EndVertical();
    GUILayout.EndHorizontal();
    /*if (agent.hasFlag)
    { //TODO: Add this function to agent
        GUILayout.BeginVertical();
        GUILayout.Label("Has the flag");        
        GUILayout.EndVertical();
    }*/
}

如果你只想显示信息,而按下按钮,你可以改变GUILayout.ButtonGUILayout.RepeatButton在你的原始代码

因为OnGUI函数像Update一样每帧调用一次。这意味着你的标签只在点击按钮时发生的OnGUI调用期间被绘制。