2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI

文章目录

  • 1 GUILayout
  • 2 EditorGUI 介绍
  • 3 文本、层级、标签、颜色拾取
    • 3.1 LabelField
    • 3.2 LayerField
    • 3.3 TagField
    • 3.4 ColorField
    • 3.5 代码示例
  • 4 枚举选择、整数选择、按下按钮
    • 4.1 EnumPopup / EnumFlagsField
    • 4.2 IntPopup
    • 4.3 DropdownButton
    • 4.4 代码示例
  • 5 对象关联、各类型输入
    • 5.1 ObjectField
    • 5.2 各类型输入
    • 5.3 代码示例
  • 6 折叠、折叠组
    • 6.1 Foldout
    • 6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup
    • 6.3 代码示例
  • 7 开关、开关组
    • 7.1 Toggle / ToggleLeft
    • 7.2 BeginToggleGroup / EndToggleGroup
    • 7.3 代码示例
  • 8 滑动条、双滑块滑动条
    • 8.1 Slider / IntSlider
    • 8.2 MinMaxSlider
    • 8.3 代码示例
  • 9 帮助框、间隔
    • 9.1 HelpBox
    • 9.2 Space
    • 9.3 代码示例
  • 10 动画曲线、布局
    • 10.1 CurveField
    • 10.2 布局相关 API
    • 10.3 代码示例

1 GUILayout

​ GUILayout 是 GUI 自动布局的公共类,其中的方法和 GUI 基本类似,均用来绘制、响应各种 UI 控件,不同之处在于 GUILayout 在 GUI 的基础上加入了自动布局功能,无需过多关心 UI 控件的位置和大小。

GUILayoutOption 布局选项

  1. 控件的固定宽高
    • GUILayout.Width(300);
    • GUILayout.Height(200);
  2. 允许控件的最小宽高
    • GUILayout.MinWidth(50);
    • GUILayout.MinHeight(50);
  3. 允许控件的最大宽高
    • GUILayout.MaxWidth(100);
    • GUILayout.MaxHeight(100);
  4. 允许或禁止水平拓展
    • GUILayout.ExpandWidth(true); //允许
    • GUILayout.ExpandHeight(false); //禁止
    • GUILayout.ExpandHeight(true); //允许
    • GUILayout.ExpandHeight(false); //禁止

2 EditorGUI 介绍

​ EditorGUI 类似 GUI,是用于绘制编辑器拓展 UI 的工具类,提供 GUI 中没有的 API(主要是编辑器功能中会用到的一些特殊控件)。

​ EditorGUILayout 类似于 GUILayout,是带有自动布局功能的 EditorGUI 绘制工具类。通常,会将 EditorGUI 和 GUI 混合使用来制作编辑器拓展功能。但由于用到自动布局功能,因此接下来着重介绍 EditorGUILayout 中的功能。EditorGUI 和它的区别仅仅是需要自己设置位置而已。

​ 详细内容:https://docs.unity.cn/cn/2022.3/ScriptReference/EditorGUILayout.html。

3 文本、层级、标签、颜色拾取

3.1 LabelField

  • EditorGUILayout.LabelField("文本标题", "文本内容");

3.2 LayerField

  • int变量 = EditorGUILayout.LayerField("层级选择", int变量);

3.3 TagField

  • string变量 = EditorGUILayout.TagField("标签选择", string变量);

3.4 ColorField

  • color变量 = EditorGUILayout.ColorField(new GUIContent("标题"), color变量, 是否显示拾色器, 是否显示透明度通道, 是否支持HDR);

3.5 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    int    layer;
    string tag;
    Color  color;

    private void OnGUI() {
        // 窗口中的控件相关绘制 逻辑处理相关的内容
        // EditorGUI相关的控件 同样还是需要在OnGUI当中进行实现 才能被显示出来

        // 文本
        EditorGUILayout.LabelField("文本标题", "测试内容");
        EditorGUILayout.LabelField("文本内容");
        
        // 层级
        layer = EditorGUILayout.LayerField("层级选择", layer);
        
        // 标签
        tag = EditorGUILayout.TagField("标签选择", tag);
        
        // 颜色获取
        color = EditorGUILayout.ColorField(new GUIContent("自定义颜色获取"), color, true, false, false);
    }
}
image-20240212141148011

4 枚举选择、整数选择、按下按钮

4.1 EnumPopup / EnumFlagsField

  • 枚举选择

    枚举变量 = (枚举类型)EditorGUILayout.EnumPopup("枚举选择", 枚举变量);

  • 多选枚举

    注意:多选枚举进行的是或运算,声明枚举时一定注意其中的赋值,并且一定要有多种情况的搭配值。

    枚举变量 = (枚举类型)EditorGUILayout.EnumFlagsField("枚举多选", 枚举变量);

4.2 IntPopup

  • int变量 = EditorGUILayout.IntPopup("整数单选框", int变量, 字符串数组, int数组);

4.3 DropdownButton

  • EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive)
    • FocusType:枚举时告诉 UI 系统能够获得键盘焦点,当用户按 Tab 键时在控件之间进行切换。
    • Keyboard:该控件可接收键盘焦点。
    • Passive:该控件不能接收键盘焦点。

4.4 代码示例

public enum E_TestType
{
    One         = 1,
    Two         = 2,
    Three       = 4,
    One_and_Two = 1 | 2,
}

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    E_TestType type;
    E_TestType type2;

    string[] strs = { "选择123", "选择234", "选择345" };
    int[]    ints = { 123, 234, 345 };
    int      num  = 0;

    private void OnGUI() {
        // 枚举选择
        type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);

        type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);

        // 整数选择控件
        // 返回值是整数数组当中的某一个值
        num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);
        EditorGUILayout.LabelField(num.ToString());

        // 按下就响应的按钮
        if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))
            Debug.Log("按下就响应");
    }
}
image-20240212142052588

5 对象关联、各类型输入

5.1 ObjectField

  • 对象变量 = EditorGUILayout.ObjectField(对象变量, typeof(对象类型), 是否允许关联场景上对象资源) as 对象类型;

5.2 各类型输入

  • int变量 = EditorGUILayout.IntField("Int输入框", int变量);

  • long变量 = EditorGUILayout.LongField("long输入框", long变量);

  • float变量 = EditorGUILayout.FloatField("Float 输入:", float变量);

  • double变量 = EditorGUILayout.DoubleField("double 输入:", double变量);

  • string变量 = EditorGUILayout.TextField("Text输入:", string变量);

  • vector2变量 = EditorGUILayout.Vector2Field("Vec2输入: ", vector2变量);

  • vector3变量 = EditorGUILayout.Vector3Field("Vec3输入: ", vector3变量);

  • vector4变量 = EditorGUILayout.Vector4Field("Vec4输入: ", vector4变量);

  • rect变量 = EditorGUILayout.RectField("rect输入: ", rect变量);

  • bounds变量 = EditorGUILayout.BoundsField("Bounds输入: ", bounds变量);

  • boundsInt变量 = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt变量);

​ 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。

5.3 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    GameObject obj;

    int    i;
    int    i2;
    float  f;
    double d;
    long   l;

    string  str;
    Vector2 vec2;
    Vector3 vec3;
    Vector4 vec4;

    Rect      rect;
    Bounds    bounds;
    BoundsInt boundsInt;

    private void OnGUI() {
        // 对象关联
        obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;
        // 各类型输入
        i = EditorGUILayout.IntField("Int输入框", i);
        EditorGUILayout.LabelField(i.ToString());
        l = EditorGUILayout.LongField("long输入框", l);
        f = EditorGUILayout.FloatField("Float 输入:", f);
        d = EditorGUILayout.DoubleField("double 输入:", d);

        str = EditorGUILayout.TextField("Text输入:", str);
        vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);
        vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);
        vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);

        rect = EditorGUILayout.RectField("rect输入: ", rect);
        bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);
        boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);

        // 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:
        //      在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。
        i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);
        EditorGUILayout.LabelField(i2.ToString());
    }
}
image-20240212142613862

6 折叠、折叠组

6.1 Foldout

  • bool变量 = EditorGUILayout.Foldout(bool变量, "标题名");

6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup

  • bool变量 = EditorGUILayout.BeginFoldoutHeaderGroup(bool变量, "标题名");

    ...

    EditorGUILayout.EndFoldoutHeaderGroup();

​ 折叠组会有高亮加粗的显示,而普通折叠没有。

image-20240212143316336

6.3 代码示例

public enum E_TestType
{
    One         = 1,
    Two         = 2,
    Three       = 4,
    One_and_Two = 1 | 2,
}

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }


    E_TestType type;
    E_TestType type2;

    string[] strs = { "选择123", "选择234", "选择345" };
    int[]    ints = { 123, 234, 345 };
    int      num  = 0;

    GameObject obj;

    int    i;
    int    i2;
    float  f;
    double d;
    long   l;

    string  str;
    Vector2 vec2;
    Vector3 vec3;
    Vector4 vec4;

    Rect      rect;
    Bounds    bounds;
    BoundsInt boundsInt;

    bool isHide;
    bool isHideGroup;

    private void OnGUI() {
        isHide = EditorGUILayout.Foldout(isHide, "折叠控件", false);

        if (isHide) {
            // 枚举选择
            type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);

            type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);

            // 整数选择控件
            // 返回值是整数数组当中的某一个值
            num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);
            EditorGUILayout.LabelField(num.ToString());

            // 按下就响应的按钮
            if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))
                Debug.Log("按下就响应");
        }

        isHideGroup = EditorGUILayout.BeginFoldoutHeaderGroup(isHideGroup, "折叠组控件");

        if (isHideGroup) {
            // 对象关联
            obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;
            // 各类型输入
            i = EditorGUILayout.IntField("Int输入框", i);
            EditorGUILayout.LabelField(i.ToString());
            l = EditorGUILayout.LongField("long输入框", l);
            f = EditorGUILayout.FloatField("Float 输入:", f);
            d = EditorGUILayout.DoubleField("double 输入:", d);

            str = EditorGUILayout.TextField("Text输入:", str);
            vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);
            vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);
            vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);

            rect = EditorGUILayout.RectField("rect输入: ", rect);
            bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);
            boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);

            // 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:
            //      在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。
            i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);
            EditorGUILayout.LabelField(i2.ToString());
        }

        EditorGUILayout.EndFoldoutHeaderGroup();
    }
}
image-20240212143225100

7 开关、开关组

7.1 Toggle / ToggleLeft

  • 普通开关

    bool变量 = EditorGUILayout.Toggle("普通开关", bool变量);

  • 左侧开关

    bool变量 = EditorGUILayout.ToggleLeft("开关在左侧", bool变量);

7.2 BeginToggleGroup / EndToggleGroup

  • bool变量 = EditorGUILayout.BeginToggleGroup("开关组", bool变量);

    ...

    EditorGUILayout.EndToggleGroup();

7.3 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    bool isTog;
    bool isTogLeft;

    bool isTogGroup;

    private void OnGUI() {
        // 开关组控件
        isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);
        
        // 开关控件
        isTog = EditorGUILayout.Toggle("开关控件", isTog);
        isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);
        EditorGUILayout.EndToggleGroup();
    }
}
image-20240212143916072

8 滑动条、双滑块滑动条

8.1 Slider / IntSlider

  • float变量 = EditorGUILayout.Slider("滑动条", float变量, 最小值, 最大值);
  • int变量 = EditorGUILayout.IntSlider("整数值滑动条", int变量, 最小值, 最大值);

8.2 MinMaxSlider

  • EditorGUILayout.MinMaxSlider("双块滑动条", ref 左侧值, ref 右侧值, 最小值, 最大值);

​ 没有返回值,通过 ref 关键字修改数值。

8.3 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    float fSlider;
    int   iSlider;

    float leftV;
    float rightV;

    private void OnGUI() {
        // 滑动条
        fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);
        iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);
        
        // 双块滑动条
        EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);
        EditorGUILayout.LabelField(leftV.ToString());
        EditorGUILayout.LabelField(rightV.ToString());
    }
}
image-20240212144337815

9 帮助框、间隔

9.1 HelpBox

  • EditorGUILayout.HelpBox("一般提示", MessageType.None);
  • EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);
  • EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);
  • EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);

9.2 Space

  • EditorGUILayout.Space(10); // 间隔 10 个单位

9.3 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    private void OnGUI() {
        EditorGUILayout.HelpBox("一般提示", MessageType.None);
        EditorGUILayout.Space(10);
        EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);
        EditorGUILayout.Space(50);
        EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);
        EditorGUILayout.Space(100);
        EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);
    }
}
image-20240212144916875

10 动画曲线、布局

10.1 CurveField

  • AnimationCurve变量 = EditorGUILayout.CurveField("动画曲线:", AnimationCurve变量);

10.2 布局相关 API

  • 水平布局

    EditorGUILayout.BeginHorizontal(); // 开始水平布局

    ...
    EditorGUILayout.EndHorizontal(); // 结束水平布局

  • 垂直布局

    EditorGUILayout.BeginVertical(); // 开始垂直布局
    ...
    EditorGUILayout.EndVertical(); // 结束垂直布局

  • 滚动视图

    Vector2布局 = EditorGUILayout.BeginScrollView(Vector2布局); // 开启滚动视图

    ...
    EditorGUILayout.EndScrollView(); // 结束滚动视图

10.3 代码示例

public class Lesson3 : EditorWindow
{
    [MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]
    private static void OpenLesson3() {
        Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");
        win.Show();
    }

    bool isTog;
    bool isTogLeft;

    bool isTogGroup;

    float fSlider;
    int   iSlider;

    float leftV;
    float rightV;

    AnimationCurve curve = new AnimationCurve();

    Vector2 vec2Pos;

    private void OnGUI() {
        vec2Pos = EditorGUILayout.BeginScrollView(vec2Pos); // 开启滚动视图

        // 开关组控件
        isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);
        // 开关控件
        isTog = EditorGUILayout.Toggle("开关控件", isTog);
        isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);
        EditorGUILayout.EndToggleGroup();

        // 滑动条
        fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);
        iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);
        // 双块滑动条
        EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);
        EditorGUILayout.LabelField(leftV.ToString());
        EditorGUILayout.LabelField(rightV.ToString());

        // 帮助框控件
        EditorGUILayout.HelpBox("一般提示", MessageType.None);
        EditorGUILayout.Space(10);
        EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);
        EditorGUILayout.Space(50);
        EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);
        EditorGUILayout.Space(100);
        EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);
        // 间隔控件

        EditorGUILayout.EndScrollView(); // 结束滚动视图

        // 动画曲线控件
        curve = EditorGUILayout.CurveField("曲线控件", curve);
        // 布局API
        EditorGUILayout.BeginHorizontal(); // 开始水平布局
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.EndHorizontal(); // 结束水平布局

        EditorGUILayout.BeginVertical(); // 开始垂直布局
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.LabelField("123123");
        EditorGUILayout.EndVertical(); // 结束垂直布局
    }
}
image-20240212145703501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/384668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】Docker Container(容器)

文章目录 一、什么是容器&#xff1f;二、为什么需要容器&#xff1f;三、容器的生命周期容器OOM容器异常退出容器暂停 四、容器命令详解docker createdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker cont…

「数据结构」哈希表1:基本概念

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 基本概念 &#x1f349;哈希表&#x1f349;哈希冲突&#x1f34c;负载因子调节&#x1f34c;解决哈希冲突&#x1f95d;1. 闭散…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理

目录 一、中断基础概念二、中断管理使用说明三、中断管理模块接口四、代码分析&#xff08;待续...&#xff09; 一、中断基础概念 在程序运行过程中&#xff0c;出现需要由 CPU 立即处理的事务时&#xff0c;CPU 暂时中止当前程序的执行转而处理这个事务&#xff0c;这个过程…

【ES】--Elasticsearch的分词器详解

目录 一、前言二、分词器原理1、常用分词器2、ik分词器模式3、指定索引的某个字段进行分词测试3.1、采用ts_match_analyzer进行分词3.2、采用standard_analyzer进行分词三、如何调整分词器1、已存在的索引调整分词器2、特别的词语不能被拆开一、前言 最近项目需求,针对客户提…

机器学习9-随机森林

随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;用于改善单一决策树的性能&#xff0c;通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

一个下载底图的网站(支持Google、必应、esri、天地图、星图地球、maptile等)

简介 hello&#xff0c;我是锐多宝&#xff0c;今天介绍一个免费的、无需登录、可自定义的底图数据下载网站。 网址为&#xff1a;https://layerdownload.ruiduobao.com/。相关信息可以看下面的视频&#xff1a; 多种遥感底图下载方法&#xff08;Google遥感底图、必应遥感底…

【电路笔记】-串联电感

串联电感 文章目录 串联电感1、概述2、电感串联示例13、互耦串联电感器4、电感串联示例25、电感串联示例36、总结 当电感器以菊花链方式连接在一起并共享公共电流时&#xff0c;它们可以串联连接在一起。 1、概述 这些电感器的互连产生了更复杂的网络&#xff0c;其总电感是各…

C++联合体详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家伙新年快乐&#xff0c;今天我们来了解一下C联合体。 文章目录 1.联合体 1.1联合体的概念 1.2联合体的思想 1.3联合体的作用 1.3.1内存优化 1.3.2二进制数据操作 1.3.3类型转换 1.3.4解决特定问…

黄金交易策略(Nerve Nnife.mql4):趋势做单

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 当大小趋势相同行情走向也相同&#xff0c;就会开仓做顺势单&#xff0c;并会顺势追单&#xff0c;以达到快速止盈平仓的效果。大趋势追求稳定&#xff0c;小趋势追求敏捷&#xff0c;行情走向比小趋势更敏…

【Java程序设计】【C00260】基于Springboot的企业客户信息反馈平台(有论文)

基于Springboot的企业客户信息反馈平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的企业客户信息反馈平台 本系统分为平台功能模块、管理员功能模块以及客户功能模块。 平台功能模块&#xff1a;在平台首页可…

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征 1 局部特征的任务牵引&#xff1a;全景拼接 ①提取特征 ②匹配特征 ③拼接图像 我们希望特征有什么特性&#xff1f; ①可重复性 ②显著性 ③计算效率和表达紧凑性 ④局部性 2 特征点检测的任务 3 角点 在角点&#…

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

npm ERR! network This is a problem related to network connectivity.

遇到 ETIMEDOUT 错误时&#xff0c;这表明npm尝试连接到npm仓库时超时了&#xff0c;这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤&#xff1a; 1. 检查网络连接 首先&#xff…

Solidworks:从2D走向3D

Sokidworks 的强大之处在于三维实体建模&#xff0c;这个形状看似复杂&#xff0c;实际上只需要拉伸一次&#xff0c;再做一次减法拉伸就行了。第一次做三维模型&#xff0c;费了不少时间才搞明白。 接下来做一个稍微复杂一点的模型&#xff0c;和上面这个操作差不多&#xff0…

华为配置双链路热备份场景下的无线配置同步示例

配置双链路热备份场景下的无线配置同步示例 组网图形 图1 配置双链路热备份示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为保证业务的正常运营&#xff0c;希望提高网络可靠性&#xff0c;同时还希望减少配置维护的工作量。为满…

团队配置管理规范浅见

在一段时间的工作过程中配置管理工作确实对我们的生产活动产生了巨大的工作量&#xff0c;现在就这个工作来进行梳理一下。 本文主要分为两部分&#xff1a; 1、借用软件系统分析师的配置管理部分内容来介绍配置管理的工作&#xff08;原谅时间精力有限&#xff0c;原文基本已…

单例模式:懒汉饿汉线程安全问题

在我们前几篇文章中都了解了一些关于线程的知识&#xff0c;那么在多线程的情况下如何创建单例模式&#xff0c;其中的线程安全问题如何解决&#xff1f; 目录 1.什么是单例模式&#xff1f; (饿汉模式) 2.单例模式(懒汉模式) *懒汉模式与懒汉模式的对比 *如何解决懒汉模式…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

【开源】SpringBoot框架开发数字化社区网格管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…