Unity3D之OnGUI知识总结

一、Label

  #region 四个角定位

        GUI.Label(new Rect(30, 10, 100, 200), "zzzzzz");
        GUI.Label(new Rect(30, Screen.height - 50, 100, 200), "zzzzzz");
        GUI.Label(new Rect(Screen.width - 50, Screen.height - 50, 100, 200), "zzzzzz");
        GUI.Label(new Rect(Screen.width - 50, 10, 100, 200), "zzzzzz");

        #endregion


二、Button

  GUI.Label(new Rect(30, 30, 100, 200), "Button");
        GUI.Button(new Rect(30, 50, 50, 50), "这个是一个按钮");
        GUI.Button(new Rect(90, 50, 50, 50), text);
        //带图片带文字的按钮
        GUIContent guic = new GUIContent("按钮", text);
        GUI.Button(new Rect(150, 50, 50, 50), guic);
        //按键从上往下排 自动排序
        if (GUILayout.Button("1"))
            Debug.Log("1");
        if (GUILayout.Button("2"))
            Debug.Log("2");
        if (GUILayout.Button("3"))
            Debug.Log("3");
        if (GUILayout.Button("4"))
            Debug.Log("4");
        if (GUILayout.Button("5"))
            Debug.Log("5");
        if (GUILayout.Button("6"))
            Debug.Log("6");
        if (GUILayout.Button("7"))
            Debug.Log("7");
        if (GUILayout.Button("8"))
            Debug.Log("8");


三、Toggle控件

      GUI.Label(new Rect(30, 100, 100, 200), "Toggle");
      toggle1 = GUI.Toggle(new Rect(30, 120, 100, 30), toggle1, "Toggle");
      toggle2 = GUI.Toggle(new Rect(30, 150, 100, 30), toggle2, text);


四、滑动条

    GUI.Label(new Rect(30180100200), "滑动条");
        hSliderValue = GUI.HorizontalSlider(new Rect(3020010030), hSliderValue, 010);
        Show("水平滑动条:" + hSliderValue);
        vSliderVaule = GUI.VerticalSlider(new Rect(020030100), vSliderVaule, 010);


五、Toolbar

  toolbarInt = GUI.Toolbar(new Rect(30, 250, 250, 30), toolbarInt, new string[] { "功能一", "功能二", "功能 三" });
        if (lastValue != toolbarInt)
        {
            if (toolbarInt == 0)
                Debug.Log(1111);
            if (toolbarInt == 1)
                Debug.Log(2222);
            if (toolbarInt == 2)
                Debug.Log(3333);
            lastValue = toolbarInt;
        }


六、Scrollbar

  GUI.Label(new Rect(30, 300, 100, 200), "Scrollbar");
        hSbarValue = GUI.HorizontalScrollbar(new Rect(30, 320, 100, 30), hSbarValue, 1.0f, 0.0f, 10.0f);
        vSbarValue = GUI.VerticalScrollbar(new Rect(0, 320, 30, 100), vSbarValue, 1.0f, 0.0f, 10.0f);


七、菜单

        GUI.Box(new Rect(30, 350, 100, 100), "Menu");
        if (GUI.Button(new Rect(40, 370, 80, 20), "1"))


八、TextField

  useNmae = GUI.TextField(new Rect(Screen.width / 2, Screen.height / 2 - 200, 150, 30), useNmae);
        //*****密码字符的掩码字符
        passWord = GUI.PasswordField(new Rect(Screen.width / 2, Screen.height / 2 - 150, 150, 30), passWord, '*', 25);
        if (GUI.Button(new Rect(Screen.width / 2, Screen.height / 2 - 50, 150, 30), "登录"))
        {
            isBntLogin = true;
            Debug.Log(isBntLogin+ "isBntLogin");
            if (useNmae.Equals("admin") && passWord.Equals("123"))
            {
                isSuccess = true;
                GUI.Label(new Rect(500, 350, 150, 30), "登录成功");
            }
            else
            {
                isSuccess = false;
                GUI.Label(new Rect(500, 350, 150, 30), "登录失败");
            }


        }
        if (isBntLogin)
        {
            if (isSuccess)
                GUI.Label(new Rect(Screen.width / 2, Screen.height / 2 + 50, 150, 30), "登录成功");
            else
            {
                GUI.Label(new Rect(Screen.width / 2, Screen.height / 2 + 50, 150, 30), "登录失败");
            }
        }



<think>好的,用户现在问的是Unity中的OnGUI怎么用。首先,我需要回忆一下OnGUI的基本知识OnGUI是Unity的旧UI系统,现在已经被UGUI取代了,但可能有些用户还在维护旧项目或者有特殊需求,所以需要了解它的使用方法。 首先,用户可能想知道如何开始使用OnGUI,所以应该从基本的结构讲起。需要提到OnGUI是在继承MonoBehaviour的脚本中重写的方法,每帧调用多次,用来渲染GUI元素。 接下来,用户可能需要具体的例子。比如创建一个按钮,显示文字,或者处理输入框。这时候要给出代码示例,并解释每个部分的作用。例如,GUI.Button的用法,参数的意义,以及如何在点击时触发事件。 然后,用户可能不了解OnGUI的调用频率和性能问题。因为OnGUI每帧调用多次,性能较差,不适合复杂UI,这点必须强调,避免用户在新项目中使用它导致性能问题。同时,要推荐使用UGUI作为更好的替代方案,并提供相关链接。 另外,用户可能想知道OnGUI的实际应用场景。比如调试信息显示、简单工具开发或者原型设计。这时候需要举一些例子,说明在哪些情况下使用OnGUI比较合适,但也要提醒其局限性。 还有,需要注意代码的正确性。比如Rect的参数是位置和大小,GUI元素的顺序会影响渲染层次,事件处理的返回值需要检查,比如按钮的点击通过if语句来判断。这些都是需要详细解释的地方。 用户可能有疑问,为什么OnGUI还在被使用,或者为什么Unity保留它。这时候需要解释兼容性和旧项目维护的原因,同时强调新项目应该使用更现代的UI系统。 最后,要确保回答结构清晰,分步骤说明,让用户能够一步步理解和应用。同时,要提醒用户避免常见的错误,比如在OnGUI中处理复杂逻辑,或者频繁创建和销毁GUI元素导致的性能问题。</think>在Unity中使用`OnGUI`的完整指南如下(基于传统IMGUI系统): --- ### 一、基础原理 1. **系统特性**: - 基于立即模式GUI(IMGUI) - 每帧多次调用(与渲染频率同步) - 适合快速原型开发/调试显示 - **性能消耗较高**,不适合正式UI开发(推荐使用UGUI) 2. **基本结构**: ```csharp using UnityEngine; public class GUIExample : MonoBehaviour { void OnGUI() { // 在此处编写GUI代码 } } ``` --- ### 二、核心组件使用 #### 1. 按钮控制 ```csharp if (GUI.Button(new Rect(10, 10, 100, 30), "Click Me")) { Debug.Log("按钮被点击"); } ``` - `Rect(x, y, width, height)`:屏幕坐标定位 - **点击检测**:通过`if`判断返回值 #### 2. 文字标签 ```csharp GUI.Label(new Rect(20, 50, 200, 20), "当前分数: " + score); ``` #### 3. 输入框 ```csharp string inputText = GUI.TextField(new Rect(20, 80, 100, 20), initialText); ``` #### 4. 滑动条 ```csharp float sliderValue = GUI.HorizontalSlider(new Rect(20, 110, 100, 30), value, 0, 100); ``` --- ### 三、布局优化技巧 #### 1. 自动布局 ```csharp GUILayout.BeginVertical(); GUILayout.Label("自动布局模式"); if (GUILayout.Button("自适应按钮")) { // 点击事件 } GUILayout.EndVertical(); ``` #### 2. 样式定制 ```csharp GUIStyle customStyle = new GUIStyle(GUI.skin.button) { fontSize = 16, normal = { textColor = Color.red }, hover = { background = Texture2D.whiteTexture } }; GUI.Button(new Rect(10, 150, 120, 40), "定制按钮", customStyle); ``` --- ### 四、实战应用场景 #### 1. 调试信息面板 ```csharp void OnGUI() { GUI.Box(new Rect(10, 10, 200, 100), "调试面板"); GUI.Label(new Rect(20, 40, 180, 20), $"FPS: {1/Time.deltaTime:F1}"); GUI.Label(new Rect(20, 60, 180, 20), $"位置: {transform.position}"); } ``` #### 2. 游戏暂停菜单 ```csharp bool isPaused = false; void OnGUI() { if (isPaused) { if (GUI.Button(new Rect(Screen.width/2-50, Screen.height/2-15, 100, 30), "继续游戏")) { Time.timeScale = 1; isPaused = false; } } } ``` --- ### 五、重要注意事项 1. **性能问题**: - 避免在移动端大量使用 - 复杂UI会导致帧率下降 - 每次调用都会重新绘制所有元素 2. **坐标系特性**: - 原点在屏幕左上角 - 单位是像素(但会受屏幕分辨率影响) - 可使用`Screen.width`/`Screen.height`获取屏幕尺寸 3. **现代替代方案**: - 推荐使用UGUI(Canvas系统) - 官方文档:[Unity UI](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/index.html) --- ### 六、保留使用场景建议 1. 快速原型开发阶段 2. 显示调试信息 3. 编辑器工具开发 4. 需要动态生成简单UI的场景 > 关键提示:Unity 2021 LTS后,IMGUI系统仍然保留但不再推荐用于游戏运行时UI,建议新项目优先采用UGUI或第三方UI解决方案(如Fungus、Dialogue System等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值