2024-07-19 Unity插件 Odin Inspector9 —— Validation Attributes

文章目录

  • 1 说明
  • 2 验证特性
    • 2.1 AssetsOnly / SceneObjectsOnly
    • 2.2 ChildGameObjectsOnly
    • 2.3 DisallowModificationsIn
    • 2.4 FilePath
    • 2.5 FolderPath
    • 2.6 MaxValue / MinValue
    • 2.7 MinMaxSlider
    • 2.8 PropertyRange
    • 2.9 Required
    • 2.10 RequiredIn
    • 2.11 RequiredListLength
    • 2.12 ValidateInput

1 说明

​ 本文介绍 Odin Inspector 插件中有关验证特性的使用方法。

2 验证特性

2.1 AssetsOnly / SceneObjectsOnly

使目标对象在 Inspector 窗口中只能关联资源 / 场景对象,限制拖拽的资源类型。

image-20240715004717713
// SceneAndAssetsOnlyExamplesComponent.csusing Sirenix.OdinInspector;
using System.Collections.Generic;
using UnityEngine;public class SceneAndAssetsOnlyExamplesComponent : MonoBehaviour
{[Title("Assets only")][AssetsOnly]public List<GameObject> OnlyPrefabs;[AssetsOnly]public GameObject SomePrefab;[AssetsOnly]public Material MaterialAsset;[AssetsOnly]public MeshRenderer SomeMeshRendererOnPrefab;[Title("Scene Objects only")][SceneObjectsOnly]public List<GameObject> OnlySceneObjects;[SceneObjectsOnly]public GameObject SomeSceneObject;[SceneObjectsOnly]public MeshRenderer SomeMeshRenderer;
}

2.2 ChildGameObjectsOnly

可用于 Components 和 GameObject,并在对象旁添加小按钮,点击按钮将显示其子物体中所有满足条件的对象。

  • IncludeSelf = true

    是否包含自身。

  • bool IncludeInactive

    是否包含未激活的子物体。

image-20240718021903335
// ChildGameObjectsOnlyAttributeExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class ChildGameObjectsOnlyAttributeExamplesComponent : MonoBehaviour
{[ChildGameObjectsOnly]public Transform ChildOrSelfTransform;[ChildGameObjectsOnly]public GameObject ChildGameObject;[ChildGameObjectsOnly(IncludeSelf = false)]public Light[] Lights;
}

2.3 DisallowModificationsIn

当该对象所在的脚本挂载在何种预制体上,其修饰的对象将被禁用 / 灰色显示。

  • PrefabKind prefabKind

    预制体的种类。

    1. None

      所有预制体,都不满足条件。

    2. InstanceInScene

      场景中的预制体实例。

    3. InstanceInPrefab

      嵌套在其他预制体中的预制件实例。

    4. Regular

      常规预制体。

    5. Variant

      预制体资产。

    6. NonPrefabInstance

      非预制体或场景中的游戏对象实例。

    7. PrefabInstance = InstanceInPrefab | InstanceInScene

      常规预制体的实例,以及场景中或嵌套在其他预制体中的预制体。

    8. PrefabAsset = Variant | Regular

      常规预制体和预制体资产。

    9. PrefabInstanceAndNonPrefabInstance = PrefabInstance | NonPrefabInstance

      预制体以及非预制实例。

    10. All = PrefabInstanceAndNonPrefabInstance | PrefabAsset

      所有预制体。

image-20240719003134858
using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;public class Test : MonoBehaviour
{[DisallowModificationsIn(PrefabKind.PrefabAsset)]public GameObject o;
}

2.4 FilePath

用于字符串,为文件路径提供接口。支持下拉选择文件路径和拖拽文件路径。

  • string ParentFolder

    父路径。可以相对于 Unity 项目,也可以是绝对路径。

  • string Extensions

    文件扩展名列表(以逗号分隔)。扩展名中的 “.” 可不写。

  • bool AbsolutePath

    是否为绝对路径。

  • bool RequireExistingPath

    true:若路径不存在,则显示警告提示。

  • bool UseBackslashes

    是否使用反斜杠(默认使用斜杠)。

image-20240718024034855
// FilePathExamplesComponent.cs
using Sirenix.OdinInspector;
using UnityEngine;public class FilePathExamplesComponent : MonoBehaviour
{// By default, FolderPath provides a path relative to the Unity project.[FilePath]public string UnityProjectPath;// It is possible to provide custom parent path. Parent paths can be relative to the Unity project, or absolute.[FilePath(ParentFolder = "Assets/Plugins/Sirenix")]public string RelativeToParentPath;// Using parent path, FilePath can also provide a path relative to a resources folder.[FilePath(ParentFolder = "Assets/Resources")]public string ResourcePath;// Provide a comma seperated list of allowed extensions. Dots are optional.[FilePath(Extensions = "cs")][BoxGroup("Conditions")]public string ScriptFiles;// By setting AbsolutePath to true, the FilePath will provide an absolute path instead.[FilePath(AbsolutePath = true)][BoxGroup("Conditions")]public string AbsolutePath;// FilePath can also be configured to show an error, if the provided path is invalid.[FilePath(RequireExistingPath = true)][BoxGroup("Conditions")]public string ExistingPath;// By default, FilePath will enforce the use of forward slashes. It can also be configured to use backslashes instead.[FilePath(UseBackslashes = true)][BoxGroup("Conditions")]public string Backslashes;// FilePath also supports member references with the $ symbol.[FilePath(ParentFolder = "$DynamicParent", Extensions = "$DynamicExtensions")][BoxGroup("Member referencing")]public string DynamicFilePath;[BoxGroup("Member referencing")]public string DynamicParent = "Assets/Plugins/Sirenix";[BoxGroup("Member referencing")]public string DynamicExtensions = "cs, unity, jpg";// FilePath also supports lists and arrays.[FilePath(ParentFolder = "Assets/Plugins/Sirenix/Demos/Odin Inspector")][BoxGroup("Lists")]public string[] ListOfFiles;
}

2.5 FolderPath

用于字符串,为目录路径提供接口。支持下拉选择文件夹目录和拖拽文件夹目录。

  • string ParentFolder

    父路径。可以相对于 Unity 项目,也可以是绝对路径。

  • bool AbsolutePath

    是否为绝对路径。

  • bool RequireExistingPath

    true:若路径不存在,则显示警告提示。

  • bool UseBackslashes

    是否使用反斜杠(默认使用斜杠)。

image-20240718024439650
// FolderPathExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class FolderPathExamplesComponent : MonoBehaviour
{// By default, FolderPath provides a path relative to the Unity project.[FolderPath]public string UnityProjectPath;// It is possible to provide custom parent path. Parent paths can be relative to the Unity project, or absolute.[FolderPath(ParentFolder = "Assets/Plugins/Sirenix")]public string RelativeToParentPath;// Using parent path, FolderPath can also provide a path relative to a resources folder.[FolderPath(ParentFolder = "Assets/Resources")]public string ResourcePath;// By setting AbsolutePath to true, the FolderPath will provide an absolute path instead.[FolderPath(AbsolutePath = true)][BoxGroup("Conditions")]public string AbsolutePath;// FolderPath can also be configured to show an error, if the provided path is invalid.[FolderPath(RequireExistingPath = true)][BoxGroup("Conditions")]public string ExistingPath;// By default, FolderPath will enforce the use of forward slashes. It can also be configured to use backslashes instead.[FolderPath(UseBackslashes = true)][BoxGroup("Conditions")]public string Backslashes;// FolderPath also supports member references and attribute expressions with the $ symbol.[FolderPath(ParentFolder = "$DynamicParent")][BoxGroup("Member referencing")]public string DynamicFolderPath;[BoxGroup("Member referencing")]public string DynamicParent = "Assets/Plugins/Sirenix";// FolderPath also supports lists and arrays.[FolderPath(ParentFolder = "Assets/Plugins/Sirenix")][BoxGroup("Lists")]public string[] ListOfFolders;
}

2.6 MaxValue / MinValue

在 Inspector 窗口中对象能够被设置的最小 / 大值。超过该范围则会有错误提示。

  • double maxValue/minValue

    最大 / 小值。

  • string Expression

    用于解析最大 / 小值的字符串。可以是字段、属性、方法名或表达式。

image-20240716045038267
// MinMaxValueValueExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class MinMaxValueValueExamplesComponent : MonoBehaviour
{// Ints[Title("Int")][MinValue(0)]public int IntMinValue0;[MaxValue(0)]public int IntMaxValue0;// Floats[Title("Float")][MinValue(0)]public float FloatMinValue0;[MaxValue(0)]public float FloatMaxValue0;// Vectors[Title("Vectors")][MinValue(0)]public Vector3 Vector3MinValue0;[MaxValue(0)]public Vector3 Vector3MaxValue0;
}

2.7 MinMaxSlider

将 Vector2 向量表示为 [min, max] 区间,并在 Inspector 窗口中以滑动条方式显示。其中,x 为最小值,y 为最大值。

  • float minValue/maxValue

    最小 / 大值。

  • string minValueGetter/maxValueGetter

    获取最小 / 大值的方法名称。

  • string minMaxValueGetter

    获取最小、大值对的方法名称。

  • bool showFields = false

    是否显示对象名称。

image-20240716045759075
// MinMaxSliderExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class MinMaxSliderExamplesComponent : MonoBehaviour
{[MinMaxSlider(-10, 10)]public Vector2 MinMaxValueSlider = new Vector2(-7, -2);[MinMaxSlider(-10, 10, true)]public Vector2 WithFields = new Vector2(-3, 4);[InfoBox("You can also assign the min max values dynamically by referring to members.")][MinMaxSlider("DynamicRange", true)]public Vector2 DynamicMinMax = new Vector2(25, 50);[MinMaxSlider("Min", 10f, true)]public Vector2 DynamicMin = new Vector2(2, 7);[InfoBox("You can also use attribute expressions with the @ symbol.")][MinMaxSlider("@DynamicRange.x", "@DynamicRange.y * 10f", true)]public Vector2 Expressive = new Vector2(0, 450);public Vector2 DynamicRange = new Vector2(0, 50);public float Min { get { return this.DynamicRange.x; } }public float Max { get { return this.DynamicRange.y; } }
}

2.8 PropertyRange

创建滑块控件,将属性的值设置在指定范围之间。

  • double min/max

    最小 / 大值。

  • string minGetter/maxGetter

    获取最小、大值的方法名称。

image-20240716051249151
// PropertyRangeExampleComponent.csusing Sirenix.OdinInspector;
using UnityEngine;public class PropertyRangeExampleComponent : MonoBehaviour
{[Range(0, 10)]public int Field = 2;[InfoBox("Odin's PropertyRange attribute is similar to Unity's Range attribute, but also works on properties.")][ShowInInspector, PropertyRange(0, 10)]public int Property { get; set; }[InfoBox("You can also reference member for either or both min and max values.")][PropertyRange(0, "Max"), PropertyOrder(3)]public int Dynamic = 6;[PropertyOrder(4)]public int Max = 100;
}

2.9 Required

如果对象没有被关联,则显示错误信息。

  • string errorMessage

    显示信息。

  • InfoMessageType messageType

    信息类型。

image-20240715005824011
// RequiredExamplesComponent.cs
using Sirenix.OdinInspector;
using UnityEngine;public class RequiredExamplesComponent : MonoBehaviour
{[Required]public GameObject MyGameObject;[Required("Custom error message.")]public Rigidbody MyRigidbody;[InfoBox("Use $ to indicate a member string as message.")][Required("$DynamicMessage")]public GameObject GameObject;public string DynamicMessage = "Dynamic error message";
}

2.10 RequiredIn

当该对象所在的脚本挂载在何种预制体上,其修饰的对象必须被关联,否则显示错误信息。

  • string errorMessage

    显示信息。

  • PrefabKind prefabKind

    预制体的种类。

    1. None

      所有预制体,都不满足条件。

    2. InstanceInScene

      场景中的预制体实例。

    3. InstanceInPrefab

      嵌套在其他预制体中的预制件实例。

    4. Regular

      常规预制体。

    5. Variant

      预制体资产。

    6. NonPrefabInstance

      非预制体或场景中的游戏对象实例。

    7. PrefabInstance = InstanceInPrefab | InstanceInScene

      常规预制体的实例,以及场景中或嵌套在其他预制体中的预制体。

    8. PrefabAsset = Variant | Regular

      常规预制体和预制体资产。

    9. PrefabInstanceAndNonPrefabInstance = PrefabInstance | NonPrefabInstance

      预制体以及非预制实例。

    10. All = PrefabInstanceAndNonPrefabInstance | PrefabAsset

      所有预制体。

image-20240715232923256
using System.Collections;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;public class Test : MonoBehaviour
{[RequiredIn(PrefabKind.PrefabAsset)]public GameObject o;
}

2.11 RequiredListLength

将 List 限制为包含指定数量的元素。

  • int minLength/maxLength

    最小 / 大长度。

  • string minLengthGetter/maxLengthGetter

    用于获取集合最小 / 大长度的 C# 表达式,例如“@this.otherList.Count”。

    如果设置了 MinLength,则当 MinLengthGetter 返回 null 时,MinLength 将作为回退。

  • string fixedLengthGetter

    用于获取集合长度的 C# 表达式。

  • PrefabKind PrefabKind

    长度限制应用于哪种预制体上。

image-20240719004053613
// RequiredListLengthExamplesComponent.csusing System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;public class RequiredListLengthExamplesComponent : MonoBehaviour
{[RequiredListLength(10)]public int[] fixedLength;[RequiredListLength(1, null)]public int[] minLength;[RequiredListLength(null, 10, PrefabKind = PrefabKind.InstanceInScene)]public List<int> maxLength;[RequiredListLength(3, 10)]public List<int> minAndMaxLength;public int SomeNumber;[RequiredListLength("@this.SomeNumber")] public List<GameObject> matchLengthOfOther;[RequiredListLength("@this.SomeNumber", null)]public int[] minLengthExpression;[RequiredListLength(null, "@this.SomeNumber")]public List<int> maxLengthExpression;
}

2.12 ValidateInput

允许检查 Inspector 窗口中拖拽关联值是否正确。

  • string condition

    判断是否正确的方法。

  • string defaultMessage

    显示信息。

  • InfoMessageType messageType

    信息类型。

image-20240715011220919
// ValidateInputExamplesComponent.csusing Sirenix.OdinInspector;
using UnityEngine;#if UNITY_EDITOR // Editor namespaces can only be used in the editor.
using Sirenix.OdinInspector.Editor.Examples;
#endifpublic class ValidateInputExamplesComponent : MonoBehaviour
{
#if UNITY_EDITOR // MyScriptyScriptableObject is an example type and only exists in the editor[HideLabel][Title("Default message", "You can just provide a default message that is always used")][ValidateInput("MustBeNull", "This field should be null.")]public MyScriptyScriptableObject DefaultMessage;
#endif[Space(12), HideLabel][Title("Dynamic message", "Or the validation method can dynamically provide a custom message")][ValidateInput("HasMeshRendererDynamicMessage", "Prefab must have a MeshRenderer component")]public GameObject DynamicMessage;[Space(12), HideLabel][Title("Dynamic message type", "The validation method can also control the type of the message")][ValidateInput("HasMeshRendererDynamicMessageAndType", "Prefab must have a MeshRenderer component")]public GameObject DynamicMessageAndType;[Space(8), HideLabel][InfoBox("Change GameObject value to update message type", InfoMessageType.None)]public InfoMessageType MessageType;[Space(12), HideLabel][Title("Dynamic default message", "Use $ to indicate a member string as default message")][ValidateInput("AlwaysFalse", "$Message", InfoMessageType.Warning)]public string Message = "Dynamic ValidateInput message";#if UNITY_EDITOR // Editor-related code must be excluded from buildsprivate bool AlwaysFalse(string value) {return false;}private bool MustBeNull(MyScriptyScriptableObject scripty) {return scripty == null;}private bool HasMeshRendererDefaultMessage(GameObject gameObject) {if (gameObject == null) return true;return gameObject.GetComponentInChildren<MeshRenderer>() != null;}private bool HasMeshRendererDynamicMessage(GameObject gameObject, ref string errorMessage) {if (gameObject == null) return true;if (gameObject.GetComponentInChildren<MeshRenderer>() == null) {// If errorMessage is left as null, the default error message from the attribute will be usederrorMessage = "\"" + gameObject.name + "\" must have a MeshRenderer component";return false;}return true;}private bool HasMeshRendererDynamicMessageAndType(GameObject gameObject, ref string errorMessage, ref InfoMessageType? messageType) {if (gameObject == null) return true;if (gameObject.GetComponentInChildren<MeshRenderer>() == null) {// If errorMessage is left as null, the default error message from the attribute will be usederrorMessage = "\"" + gameObject.name + "\" should have a MeshRenderer component";// If messageType is left as null, the default message type from the attribute will be usedmessageType = this.MessageType;return false;}return true;}
#endif
}

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

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

相关文章

Python数据风险案例54——人工智能热门概念股爬虫分析其价值(三因子模型)

案例背景 人工智能概念如火如荼的夏天&#xff0c;在这个2024年&#xff0c;我觉得需要提早布局一下这个概念。所以我们找一下A股里面人们的人工智能概念股&#xff0c;然后分析他们的数据应用三因子模型&#xff0c;也就是最经典的资本资产定价模型的衍生版去研究他们各自的投…

51 单片机[8]:串口通信

一、目标 单片机通过串口向电脑发送数据&#xff08;数字递增&#xff09;电脑通过串口控制单片机上的LED 二、基本概念 1. 串口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 单片机的串口可以…

Visio绘制的relu激活函数结构图,可导出高清图片,可修改,无水印。

Visio绘制的relu激活函数结构图,可导出高清图片&#xff0c;可修改&#xff0c;无水印。 方便用于小论文写作&#xff0c;方便用于毕业设计。 Visio版本为2021版&#xff0c;可用更高版本打开。 下载地址&#xff1a;地址 图片展示&#xff1a;

【Linux Commands】命令分类整理-命令搜索引擎-速查手册

Linux命令速查网站&#xff1a;https://linux.embeddev.asia 目前已经搜集了600条命令,对每一条命令都有详细的介绍。 本文展示的命令不全是安装系统时自带的。 Linux命令基于Unix哲学&#xff0c;旨在创建简单、短小、可组合的工具。每个命令通常只执行一个任务&#xff0…

open3d:随机采样一致性分割平面

1、背景介绍 随机采样一致性算法&#xff08;RANSAC Random Sample Consensus&#xff09;是一种迭代的参数估计算法&#xff0c;主要用于从包含大量噪声数据的样本中估计模型参数。其核心思想是通过随机采样和模型验证来找到数据中最符合模型假设的点。因此&#xff0c;只要事…

TI 【ads131m02】DSP TMS320F280049C调试与学习笔记

ads131m02 调试与学习笔记 时序SPI 参考链接&#xff1a; ADS131M02_TI官网资料参考 ADS131M02—英文使用手册 ADS131M0x—参考代码 Example C Code ADS131M02 是一款 two 通道、同步采样、24 位、ΔΣ 模数转换器 (ADC)&#xff0c;具有宽动态范围、低功耗和电能测量特定功能…

你还在手动构建Python项目吗?PyBuilder让一切自动化!

在 Python 项目开发中&#xff0c;构建和管理项目是一项繁琐但必不可少的工作。你可能需要处理依赖项、运行测试、生成文档等。这时候&#xff0c;PyBuilder 出场了。它是一个强大的构建自动化工具&#xff0c;可以帮助你简化项目管理&#xff0c;让你更专注于编写代码。 什么…

Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left&#xff08;分别管理左右手的 Interactor&#xff09;下的 HandPokeInteractor 子物体&#x…

JMX 反序列化漏洞

前言 前段时间看到普元 EOS Platform 爆了这个洞&#xff0c;Apache James&#xff0c;Kafka-UI 都爆了这几个洞&#xff0c;所以决定系统来学习一下这个漏洞点。 JMX 基础 JMX 前置知识 JMX&#xff08;Java Management Extensions&#xff0c;即 Java 管理扩展&#xff0…

程序的机器级表示(一)汇编,汇编格式和数据传输指令

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3 程序的机器级表示3.1 历史观点3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例3.4.4 压入和弹出栈数据 3 程序的机…

达梦数据库系列—30. DTS迁移Mysql到DM

目录 1.MySQL 源端信息 2.DM 目的端信息 3.迁移评估 4.数据库迁移 4.1源端 MySQL 准备 4.2目的端达梦准备 初始化参数设置 兼容性参数设置 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置迁移对象及策略 开始迁移 对象补迁 5.数据校验 统计 MySQL 端对象及数…

Unity: TextMeshPro生成中文字体(附3.5k,7k,2w常用字集)

免费常用3千5&#xff0c;7千字&#xff0c;2万字中文字体包 1.选择Window/TextMeshPro/Font Asset Creator 注&#xff1a;准备字体&#xff1a;从字体库或其他来源获取中文字体文件&#xff0c;通常为.ttf、.otf或.ttc格式。最简单的方式是从Windows系统文件的Font文件夹里…

应用层自定义协议与序列化

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 协议 简单来说&#xff0c;就是通信双方约定好的结构化的数据。 序列化与反序列化 我们通过一个问题引入这个概念&#xff0c;假如我们要实现一个网络版的计算器&#xff0c;那么现在有两种方案&#xff0c;第一种&#x…

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…

软件测试----概念篇(笔试相关,一般考察开发模型和测试模型的特点及适用场景)

文章目录 前言一、需求二、开发模型1.什么是“模型”2.软件的生命周期3.常见开发模型瀑布模型螺旋模型增量模型、迭代模型敏捷模型 三、测试模型V模型W模型(双V模型&#xff09; 前言 在当今软件行业飞速发展的时代&#xff0c;软件测试已成为软件质量保障的重要环节。它贯穿于…

WhisperX

文章目录 一、关于 WhisperX新闻 &#x1f6a8; 二、设置⚙️1、创建Python3.10环境2、安装PyTorch&#xff0c;例如Linux和Windows CUDA11.8&#xff1a;3、安装此repo4、Speaker Diarization 三、使用&#x1f4ac;&#xff08;命令行&#xff09;1、English2、他语言例如德语…

Cyber Weekly #16

赛博新闻 1、OpenAI 发布 GPT-4o mini OpenAI 本周官宣推出 GPT-4o mini&#xff0c;这是 GPT-4o 更小参数量的简化版本。ChatGPT 的免费用户、Plus 用户和 Team 用户能使用 GPT-4o mini 而并非 GPT-3.5 Turbo&#xff0c;企业用户在下周也将获得 GPT-4o mini 的权限。GPT-4o…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展&#xff0c;社会对人才的需求正发生深刻变革&#xff0c;计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下&#xff0c;培养孩子们运用计算思维解决实际问题的能力&#xff0c;成为教育领域的重要任务。编…

UE4-获得角色控制权的两种方法

方法一&#xff1a; 方法二&#xff1a; 注意此方法不能有多个玩家出生点&#xff0c;如果有多个玩家出生点&#xff0c;会随机的选择一个玩家出生点进行生成。