2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

news2024/11/15 9:40:31

文章目录

  • 1 说明
  • 2 集合相关特性
    • 2.1 DictionaryDrawerSettings
    • 2.2 ListDrawerSettings
    • 2.3 TableColumnWidth
    • 2.4 TableList
    • 2.5 TableMatrix

1 说明

​ 本文介绍 Odin Inspector 插件中集合(Dictionary、List)相关特性的使用方法。

2 集合相关特性

2.1 DictionaryDrawerSettings

自定义 Dictionary 在 Inspector 窗口中的显示样式。类需要继承 SerializedMonoBehaviour。

  • string KeyLabel = "Key"

    显示的键标题名。

  • ValueLabel = "Value"

    显示的值标题名。

  • DictionaryDisplayOptions DisplayMode

    字典显示样式。

  • bool IsReadOnly = false

    键是否只读(不是值)。

image-20240715012958264
// DictionaryExamplesComponent.cs

using Sirenix.OdinInspector;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endif

public class DictionaryExamplesComponent : SerializedMonoBehaviour
{
    [InfoBox("In order to serialize dictionaries, all we need to do is to inherit our class from SerializedMonoBehaviour.")]
    public Dictionary<int, Material> IntMaterialLookup;

    [DictionaryDrawerSettings(IsReadOnly = true)]
    public Dictionary<string, string> StringStringDictionary;

    [DictionaryDrawerSettings(KeyLabel = "Custom Key Name", ValueLabel = "Custom Value Label")]
    public Dictionary<SomeEnum, MyCustomType> CustomLabels = new Dictionary<SomeEnum, MyCustomType>() {
        { SomeEnum.First, new MyCustomType() },
        { SomeEnum.Second, new MyCustomType() },
    };

    [DictionaryDrawerSettings(DisplayMode = DictionaryDisplayOptions.ExpandedFoldout)]
    public Dictionary<string, List<int>> StringListDictionary = new Dictionary<string, List<int>>() {
        { "Numbers", new List<int>() { 1, 2, 3, 4, } },
    };

    [DictionaryDrawerSettings(DisplayMode = DictionaryDisplayOptions.Foldout)]
    public Dictionary<SomeEnum, MyCustomType> EnumObjectLookup = new Dictionary<SomeEnum, MyCustomType>() {
        { SomeEnum.Third, new MyCustomType() },
        { SomeEnum.Fourth, new MyCustomType() },
    };

    [InlineProperty(LabelWidth = 90)]
    public struct MyCustomType
    {
        public int        SomeMember;
        public GameObject SomePrefab;
    }

    public enum SomeEnum
    {
        First, Second, Third, Fourth, AndSoOn
    }

#if UNITY_EDITOR // Editor-related code must be excluded from builds
    [OnInspectorInit]
    private void CreateData() {
        IntMaterialLookup = new Dictionary<int, Material>() {
            { 1, ExampleHelper.GetMaterial() },
            { 7, ExampleHelper.GetMaterial() },
        };

        StringStringDictionary = new Dictionary<string, string>() {
            { "One", ExampleHelper.GetString() },
            { "Seven", ExampleHelper.GetString() },
        };
    }
#endif
}

2.2 ListDrawerSettings

自定义 List 在 Inspector 窗口中的显示样式。

  • bool IsReadOnly = true

    是否在 Inspector 窗口中只读。

  • int NumberOfItemsPerPage

    列表每页的成员个数,超过该个数则会翻页。

  • bool ShowIndexLabels

    是否显示列表每个 item 的下标。

  • string ListElementLabelName

    指定每个列表元素内的成员名称。

  • bool DraggableItems

    列表成员是否可以在 Inspector 窗口中通过拖拽改变顺序。

  • bool ShowFoldout = true

    列表成员是否折叠显示。

  • bool ShowPaging = true

    是否启用分页显示。

  • bool ShowItemCount = true

    是否显示成员个数。

  • string OnBeginListElementGUI

    在每个列表元素之前调用的方法。引用的成员必须具有对应名称的方法。返回类型为 void,参数为 int 类型,表示该成员在列表中的索引。

  • string OnEndListElementGUI

    在每个列表元素之后调用的方法。引用的成员必须具有对应名称的方法。返回类型为 void,参数为 int 类型,表示该成员在列表中的索引。

  • string OnTitleBarGUI

    使用此功能将自定义 GUI 注入列表的标题栏。

  • string CustomAddFunction

    覆盖向列表中添加对象的默认行为。

    如果引用的方法返回列表类型元素,则每个选定对象将调用一次。

    如果引用的方法返回 void,则无论选择了多少对象,都只会被调用一次。

image-20240715020016676
// ListExamplesComponent.cs

using Sirenix.OdinInspector;
using System;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.Utilities.Editor;
#endif

public class ListExamplesComponent : MonoBehaviour
{
#if UNITY_EDITOR // Editor-related code must be excluded from builds
    [PropertyOrder(int.MinValue), OnInspectorGUI]
    private void DrawIntroInfoBox() {
        // SirenixEditorGUI.InfoMessageBox("Out of the box, Odin significantly upgrades the drawing of lists and arrays in the inspector - across the board, without you ever lifting a finger.");
    }
#endif

    [Title("List Basics")]
    // [InfoBox("List elements can now be dragged around to reorder them and deleted individually, and lists have paging (try adding a lot of elements!). You can still drag many assets at once into lists from the project view - just drag them into the list itself and insert them where you want to add them.")]
    public List<float> FloatList;

    // [InfoBox("Applying a [Range] attribute to this list instead applies it to all of its float entries.")]
    [Range(0, 1)]
    public float[] FloatRangeArray;

    // [InfoBox("Lists can be made read-only in different ways.")]
    [ListDrawerSettings(IsReadOnly = true)]
    public int[] ReadOnlyArray1 = new int[] { 1, 2, 3 };

    [ReadOnly]
    public int[] ReadOnlyArray2 = new int[] { 1, 2, 3 };

    public SomeOtherStruct[] SomeStructList;

    [Title("Advanced List Customization")]
    // [InfoBox("Using [ListDrawerSettings], lists can be customized in a wide variety of ways.")]
    [ListDrawerSettings(NumberOfItemsPerPage = 5)]
    public int[] FiveItemsPerPage;

    [ListDrawerSettings(ShowIndexLabels = true, ListElementLabelName = "SomeString")]
    public SomeStruct[] IndexLabels;

    [ListDrawerSettings(DraggableItems = false, ShowFoldout = false, ShowIndexLabels = true, ShowPaging = false, ShowItemCount = false,
                        HideRemoveButton = true)]
    public int[] MoreListSettings = new int[] { 1, 2, 3 };

    [ListDrawerSettings(OnBeginListElementGUI = "BeginDrawListElement", OnEndListElementGUI = "EndDrawListElement")]
    public SomeStruct[] InjectListElementGUI;

    [ListDrawerSettings(OnTitleBarGUI = "DrawRefreshButton")]
    public List<int> CustomButtons;

    [ListDrawerSettings(CustomAddFunction = "CustomAddFunction")]
    public List<int> CustomAddBehaviour;

    [Serializable]
    public struct SomeStruct
    {
        public string SomeString;
        public int    One;
        public int    Two;
        public int    Three;
    }

    [Serializable]
    public struct SomeOtherStruct
    {
        [HorizontalGroup("Split", 55), PropertyOrder(-1)]
        [PreviewField(50, Sirenix.OdinInspector.ObjectFieldAlignment.Left), HideLabel]
        public UnityEngine.MonoBehaviour SomeObject;

        [FoldoutGroup("Split/$Name", false)]
        public int A, B, C;

        [FoldoutGroup("Split/$Name", false)]
        public int Two;

        [FoldoutGroup("Split/$Name", false)]
        public int Three;

        private string Name { get { return this.SomeObject ? this.SomeObject.name : "Null"; } }
    }

#if UNITY_EDITOR // Editor-related code must be excluded from builds
    private void BeginDrawListElement(int index) {
        SirenixEditorGUI.BeginBox(this.InjectListElementGUI[index].SomeString);
    }

    private void EndDrawListElement(int index) {
        SirenixEditorGUI.EndBox();
    }

    private void DrawRefreshButton() {
        if (SirenixEditorGUI.ToolbarButton(EditorIcons.Refresh)) {
            Debug.Log(this.CustomButtons.Count.ToString());
        }
    }

    private int CustomAddFunction() {
        Debug.Log("Custom add function called!");
        return this.CustomAddBehaviour.Count;
    }
#endif
}

2.3 TableColumnWidth

控制 List 成员显示在表格中显示的宽度。

  • int width

    宽度。

  • bool resizable = true

    宽度是否可通过拖拽调节。

image-20240715021137994
// TableColumnWidthExampleComponent.cs

using Sirenix.OdinInspector;
using System;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endif

public class TableColumnWidthExampleComponent : MonoBehaviour
{
    [TableList(ShowIndexLabels = true)]
    public List<MyItem> List = new List<MyItem>() {
        new MyItem(),
        new MyItem(),
        new MyItem(),
    };

    [Serializable]
    public class MyItem
    {
        [PreviewField(Height = 20)]
        [TableColumnWidth(30, Resizable = false)]
        public Texture2D Icon;

        [TableColumnWidth(60)]
        public int ID;

        public string Name;

#if UNITY_EDITOR // Editor-related code must be excluded from builds
        [OnInspectorInit]
        private void CreateData() { // 每次点击 Inspector 窗口时,更新 Texture
            Icon = ExampleHelper.GetTexture();
        }
#endif
    }
}

2.4 TableList

将 List 绘制成表格形状。

  • bool IsReadOnly = true

    是否在 Inspector 窗口中只读。

  • int NumberOfItemsPerPage

    列表每页的成员个数,超过该个数则会翻页。

  • bool ShowIndexLabels

    是否显示列表每个 item 的下标。

  • bool ShowPaging = true

    是否启用分页显示。

  • bool ShowItemCount = true

    是否显示成员个数。

  • bool HideToolbar = false

    是否隐藏标题栏。

  • bool DrawScrollView = true

    是否绘制滚动条。

  • int MaxScrollViewHeight/MinScrollViewHeight

    滚动条绘制的范围(最大高度/最小高度),单位:像素。

  • bool AlwaysExpanded

    List 是否可折叠。

image-20240715021626235
// TableListExamplesComponent.cs

using Sirenix.OdinInspector;
using System;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endif

public class TableListExamplesComponent : MonoBehaviour
{
    [TableList(ShowIndexLabels = true)]
    public List<SomeCustomClass> TableListWithIndexLabels = new List<SomeCustomClass>() {
        new SomeCustomClass(),
        new SomeCustomClass(),
    };

    [TableList(DrawScrollView = true, MaxScrollViewHeight = 200, MinScrollViewHeight = 100)]
    public List<SomeCustomClass> MinMaxScrollViewTable = new List<SomeCustomClass>() {
        new SomeCustomClass(),
        new SomeCustomClass(),
    };

    [TableList(AlwaysExpanded = true, DrawScrollView = false)]
    public List<SomeCustomClass> AlwaysExpandedTable = new List<SomeCustomClass>() {
        new SomeCustomClass(),
        new SomeCustomClass(),
    };

    [TableList(ShowPaging = true, NumberOfItemsPerPage = 3)]
    public List<SomeCustomClass> TableWithPaging = new List<SomeCustomClass>() {
        new SomeCustomClass(),
        new SomeCustomClass(),
    };

    [Serializable]
    public class SomeCustomClass
    {
        [TableColumnWidth(57, Resizable = false)]
        [PreviewField(Alignment = ObjectFieldAlignment.Center)]
        public Texture Icon;

        [TextArea]
        public string Description;

        [VerticalGroup("Combined Column"), LabelWidth(22)]
        public string A, B, C;

        [TableColumnWidth(60)]
        [Button, VerticalGroup("Actions")]
        public void Test1() { }

        [TableColumnWidth(60)]
        [Button, VerticalGroup("Actions")]
        public void Test2() { }

#if UNITY_EDITOR // Editor-related code must be excluded from builds
        [OnInspectorInit]
        private void CreateData() {
            Description = ExampleHelper.GetString();
            Icon        = ExampleHelper.GetTexture();
        }
#endif
    }
}

2.5 TableMatrix

绘制二维数组。

  1. 单元格绘制。

    • string HorizontalTitle

      水平标题。

    • bool SquareCells

      如果为 true,则每行的高度将与第一个单元格的宽度相同。

image-20240715022259336
// TableMatrixExamplesComponent.cs

using Sirenix.OdinInspector;
using UnityEngine;

#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endif

public class TableMatrixExamplesComponent : SerializedMonoBehaviour
{
    [TableMatrix(HorizontalTitle = "Square Celled Matrix", SquareCells = true)]
    public Texture2D[,] SquareCelledMatrix;

    [TableMatrix(SquareCells = true)]
    public Mesh[,] PrefabMatrix;

#if UNITY_EDITOR // Editor-related code must be excluded from builds
    [OnInspectorInit]
    private void CreateData() {
        SquareCelledMatrix = new Texture2D[8, 4] {
            { ExampleHelper.GetTexture(), null, null, null },
            { null, ExampleHelper.GetTexture(), null, null },
            { null, null, ExampleHelper.GetTexture(), null },
            { null, null, null, ExampleHelper.GetTexture() },
            { ExampleHelper.GetTexture(), null, null, null },
            { null, ExampleHelper.GetTexture(), null, null },
            { null, null, ExampleHelper.GetTexture(), null },
            { null, null, null, ExampleHelper.GetTexture() },
        };

        PrefabMatrix = new Mesh[8, 4] {
            { ExampleHelper.GetMesh(), null, null, null },
            { null, ExampleHelper.GetMesh(), null, null },
            { null, null, ExampleHelper.GetMesh(), null },
            { null, null, null, ExampleHelper.GetMesh() },
            { null, null, null, ExampleHelper.GetMesh() },
            { null, null, ExampleHelper.GetMesh(), null },
            { null, ExampleHelper.GetMesh(), null, null },
            { ExampleHelper.GetMesh(), null, null, null },
        };
    }
#endif
}
  1. 表格绘制

    • bool IsReadOnly

      如果为 true,则插入、删除和拖动列和行将不可用。但单元格本身仍将是可修改的。

      如果要禁用所有内容,可以使用 ReadOnly 属性。

    • string VerticalTitle

      垂直标题。

image-20240715022550956
// TableMatrixTitleExampleComponent.cs

using Sirenix.OdinInspector;
using UnityEngine;

public class TableMatrixTitleExampleComponent : SerializedMonoBehaviour
{
    [TableMatrix(HorizontalTitle = "Read Only Matrix", IsReadOnly = true)]
    public int[,] ReadOnlyMatrix = new int[5, 5];

    [TableMatrix(HorizontalTitle = "X axis", VerticalTitle = "Y axis")]
    public InfoMessageType[,] LabledMatrix = new InfoMessageType[6, 6];
}
  1. 图形绘制

    • string DrawElementMethod

      覆盖绘制每个单元格的方式。

      输入参数:Rect rect, T value

      输出:T

    • bool ResizableColumns = true

      列是否可调整大小。

    • RowHeight

      行高,0 表示默认高度。

    • bool Transpose

      如果为 true,则表的行/列颠倒绘制(C# 初始化顺序)。

image-20240715023026208
// TransposeTableMatrixExampleComponent.cs

using Sirenix.OdinInspector;
using Sirenix.Utilities;
using UnityEngine;

public class TransposeTableMatrixExampleComponent : SerializedMonoBehaviour
{
    [TableMatrix(HorizontalTitle = "Custom Cell Drawing", DrawElementMethod = nameof(DrawColoredEnumElement), ResizableColumns = false, RowHeight = 16)]
    public bool[,] CustomCellDrawing;

    [ShowInInspector, DoNotDrawAsReference]
    [TableMatrix(HorizontalTitle = "Transposed Custom Cell Drawing", DrawElementMethod = "DrawColoredEnumElement", ResizableColumns = false, RowHeight = 16, Transpose = true)]
    public bool[,] Transposed { get { return CustomCellDrawing; } set { CustomCellDrawing = value; } }

#if UNITY_EDITOR // Editor-related code must be excluded from builds
    private static bool DrawColoredEnumElement(Rect rect, bool value) {
        if (Event.current.type == EventType.MouseDown && rect.Contains(Event.current.mousePosition)) {
            value       = !value;
            GUI.changed = true;
            Event.current.Use();
        }

        UnityEditor.EditorGUI.DrawRect(rect.Padding(1), value ? new Color(0.1f, 0.8f, 0.2f) : new Color(0, 0, 0, 0.5f));

        return value;
    }

    [OnInspectorInit]
    private void CreateData() {
        // =)
        this.CustomCellDrawing        = new bool[15, 15];
        this.CustomCellDrawing[6, 5]  = true;
        this.CustomCellDrawing[6, 6]  = true;
        this.CustomCellDrawing[6, 7]  = true;
        this.CustomCellDrawing[8, 5]  = true;
        this.CustomCellDrawing[8, 6]  = true;
        this.CustomCellDrawing[8, 7]  = true;
        this.CustomCellDrawing[5, 9]  = true;
        this.CustomCellDrawing[5, 10] = true;
        this.CustomCellDrawing[9, 9]  = true;
        this.CustomCellDrawing[9, 10] = true;
        this.CustomCellDrawing[6, 11] = true;
        this.CustomCellDrawing[7, 11] = true;
        this.CustomCellDrawing[8, 11] = true;
    }
#endif
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Programming from the Ground Up》阅读笔记:p49-p74

《Programming from the Ground Up》学习第3天&#xff0c;p49-p74总结&#xff0c;总计26页。 一、技术总结 1.function (1)定义 p49, Functions are unit of code that do a defined piece of work on specified types of data。 函数是在指定类型的数据上完成所定义的某…

【Qt 常用控件】

文章目录 1. Push Button 1. Push Button &#x1f427;给按钮设置图标

供应链管理(SCM):如何在颜值和体验上发力

要在供应链管理系统&#xff08;SCM&#xff09;中在颜值和体验上发力&#xff0c;让用户感觉耳目一新&#xff0c;可以采取以下措施&#xff1a; 界面设计优化&#xff1a; 对供应链管理系统的界面进行优化&#xff0c;注重界面的美观、简洁和易用性。采用现代化的设计风格、…

Catena-x标准解读:CX-0001 EDC Discovery API v1.0.2 EDC发现API

随着Catena-X网络的扩展&#xff0c;大量数据资产将通过EDC连接技术提供。在网络中有效地识别正确的EDC端点可能很困难。 为了符合GAIA-X标准&#xff0c;每个EDC端点必须提供ServiceOffering类型的自我描述&#xff08;SD&#xff09;。基于这些SD&#xff0c;必须提供数据和…

可视化作品集(14)智慧旅游和智慧景区,洞悉一切。

智慧旅游和智慧景区的可视化大屏可以带来以下几个方面的好处&#xff1a; 1. 提升游客体验&#xff1a; 通过可视化大屏&#xff0c;游客可以方便地获取到景区地图、交通信息、景点介绍、活动安排等信息&#xff0c;帮助游客更好地规划行程&#xff0c;提升游览体验。 2. 提供…

手写new

手写new new是什么执行new会发生什么实现new new是什么 new 操作符是可以创建一个用户定义的对象的实例或具有构造函数的内置对象的实例 function Car (make, model, year) {this.make makethis.model modelthis.year year } Car.prototype.running function () {return …

Zynq系列FPGA实现SDI编解码转SFP光口传输(光端机),基于GTX高速接口,提供6套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx-Kintex7上的应用 3、详细设计方案设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->HDMIVDMA图像缓存RGB转BT1120GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBHDMI输…

实习随笔【iviews的Select实现‘与全部互斥’的多选】

在实习中&#xff0c;遇到了如下需求&#xff0c;要求如下&#xff1a; 上面提到了一个需求为&#xff0c;选择全部与选择一个或者多个互斥&#xff0c;我们来看一下如何解决 核心代码 监听value的变化&#xff0c;如果含有‘全部’&#xff0c;且数组长度>1&#xff0c;则删…

Redis面试问题一

Redis在面试中有很大的概率会问到&#xff0c;因此我们一定要学会回答此方面的问题。 Redis主要涉及到使用场景已经一些其他方面的问题。 下面是有可能涉及到的问题。 问题一&#xff1a;你最近的项目中那些场景用到了Redis呢&#xff1f; 需要结合简历项目上的业务进行具体…

Rust 通过 Deref trait 将智能指针当作常规引用处理

通过 Deref trait 将智能指针当作常规引用处理 实现 Deref trait 允许我们重载 解引用运算符&#xff08;dereference operator&#xff09;*&#xff08;与乘法运算符或通配符相区别&#xff09;。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待&#xff…

WPF+MvvmLight 项目入门完整教程(一)

WPF+MvvmLight入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架…

SQL Server 2019安装详细教程(图文详解,非常靠谱)

Microsoft SQL Server 是一种关系数据库管理系统 (RDBMS)。 应用程序和工具连接到 SQL Server 实例或数据库&#xff0c;并使用 Transact-SQL (T-SQL) 进行通信。 SQL Server Management Studio (SSMS) 是一种集成环境&#xff0c;用于管理任何 SQL 基础结构。 使用 SSMS 访问、…

AutoGen实战AI Agent开发

最近&#xff0c;关于 AI 智能体或AI代理&#xff08;AI Agent&#xff09;的讨论很多。受这种炒作的影响&#xff0c;我阅读了一些资料&#xff0c;偶然发现了 AutoGen&#xff0c;这是一个构建 AI 代理的很棒的库。但 AI 代理到底是什么&#xff1f;为什么它们很重要&#xf…

移动UI:表单美观易操作的十大准则,非常实用。

移动端表单设计需要遵循一些原则&#xff0c;以确保美观和易操作&#xff1a; 1.简洁明了&#xff1a; 在移动端表单设计中&#xff0c;要尽量简化内容&#xff0c;避免过多的文字和元素&#xff0c;保持简洁明了的布局&#xff0c;以便用户能够快速理解并填写表单。 2.响应式…

在 PostgreSQL 中如何优化涉及多个视图嵌套和函数调用的复杂查询?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中如何优化涉及多个视图嵌套和函数调用的复杂查询一、理解问题的本质二、优化的基本原则…

直播美颜工具开发教学:视频美颜SDK集成详解

本篇文章&#xff0c;笔者将详细介绍如何在直播应用中集成视频美颜SDK&#xff0c;让你的直播画面焕然一新。 一、什么是视频美颜SDK&#xff1f; 视频美颜SDK是一种软件开发工具包&#xff0c;提供了视频处理和图像增强功能。通过集成视频美颜SDK&#xff0c;开发者可以轻松…

【postgresql】角色(Role)

PostgreSQL 中&#xff0c;角色&#xff08;Role&#xff09;是一个重要的概念&#xff0c;用于管理数据库的访问权限和用户身份。角色可以被视为用户或组&#xff0c;具体取决于它们的配置方。 角色属性 角色可以具有多种属性&#xff1a; LOGIN&#xff1a;允许角色登录数据…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events &#xff08;专栏目录&#xff09; 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域&#xff0c;新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

2024.7.12单片机PWM

遇到了一个光标变成下划线的问题&#xff1a; Keil5光标变下划线&#xff0c;变回来的方法_keil5光标是下划线-CSDN博客 这里是用了输入捕获&#xff08;IC&#xff1a;input capture&#xff09;&#xff0c;输出比较&#xff08;OC:Output Compare&#xff09;区别 学到这…

[Linux]添加sudoers

之前我们讲过sudo这个命令,它可以让我们普通用户进行短暂的提权,上回我们讲完了vim 本篇是个短篇,目的就是让我们之后的学习中可以使用sudo命令。 首先我们先登录root用户 ls /etc/sudoer 我们需要改的就是上面的这个文件 vim /etc/sudoers 我们用vim打开 把光标移动到这…