【问题标题】:Change Window Layout with GUILayout.Button in Unity & C#在 Unity 和 C# 中使用 GUILayout.Button 更改窗口布局
【发布时间】:2012-01-09 08:59:09
【问题描述】:

我正在尝试使用 GUILayout 按钮(以及开始/结束垂直/水平等)在 Unity 中创建一个菜单,并且我想要它,以便当我单击一个按钮时,某些信息会显示在它的下方。我正在尝试使用此代码:

foreach(agents中的Agent代理)//(EntityManager.FindAll()中的Agent代理) {

    //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 代码的原因)。但是,我添加的所有内容(例如标签)都不会在单击按钮时出现。做我想做的事情的正确方法是什么?

【问题讨论】:

    标签: c# user-interface unity3d


    【解决方案1】:

    不太确定统一性。但似乎没有点击事件。 似乎是您唯一影响 gui 布局而无需调用和事件。 如果您需要在单击按钮时显示标签或更改布局,我会建议。

    1. 1st 我将创建一个包含标签布局的新函数,这应该在一个 gui 类中,但我知道你只是将脚本附加到向导创建的对象上?
    2. 第二个我会为你的按钮创建一个事件处理程序,比如说按钮1? public button1_onClick(事件处理程序属性去听)
    3. 最后我会简单地调用事件处理方法内部的标签布局方法 公共按钮1_onclick(){ 标签1布局(); }

    类似的东西。虽然不确定这是你的意思。 希望这能让您大致了解事件的过程以及如何使用它们

    【讨论】:

      【解决方案2】:

      在统一 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.Button 更改为 GUILayout.RepeatButton

      【讨论】:

        【解决方案3】:

        因为OnGUI 函数在每一帧都被调用,例如Update。这意味着您的标签仅在单击按钮时发生的 OnGUI 调用期间被绘制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-23
          • 2021-06-13
          • 1970-01-01
          • 2014-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多