unity的特性AttriBute详解

news2024/11/19 19:21:32

unity的特性AttriBute曾经令我大为头疼。因为不动使用的法则,但是教程都是直接就写,卡住就不能继续学下去。令我每一次看到,直接不敢看了。

今天使用文心一言搜索一番,发现,恐惧都是自己想象的,实际上这个很简单。

这个小故事,告诉我们想千次万次,不如实地走一次。越是畏惧,就需要越去了解他。

克服恐惧的心里就是每天去见它。

在Unity中,特性(Attributes)是一种强大的工具,用于为代码元素(如类、方法、字段等)添加元数据。这些元数据可以在运行时或编译时被其他代码或工具读取和使用,以改变代码的行为或提供额外的信息。Unity的特性有很多使用场景,以下是一些常见的场景和例子分析:

1. 序列化(Serialization)与数据持久化

使用场景

  • 当需要保存和加载对象的状态时,可以使用序列化特性。例如,保存游戏进度、玩家数据或配置设置。
  • 序列化特性用于将对象状态转换为可存储或传输的格式,这对于保存游戏状态、玩家数据或配置信息至关重要。

例子分析

使用[Serializable]特性来标记一个类,使其可以被序列化

这样,你就可以将该类的实例转换为字节流,保存到文件或通过网络发送,然后再将其反序列化为对象。

[Serializable]特性用于标记类,使其可以被序列化。

这对于保存和加载游戏对象的状态、玩家进度等信息非常有用。

如果是字段的【serializedField】 就是将私有的字段   公开在面板方便操作。

[Serializable]特性用于标记类,

1.1类被序列化怎么应用

序列化是将对象的状态转换为可以存储或传输的格式的过程,

而反序列化则是将序列化后的数据转换回对象状态的过程。

在这个例子中,PlayerData类被标记为[Serializable]

这意味着它的实例可以被序列化。

该类包含了玩家的名称、分数和位置信息,这些信息可以在游戏过程中被保存并在需要时重新加载。

1.2序列化对象

在序列化对象时,需要注意以下几点:

  • 不是所有的类型都可以被序列化。例如,Unity的某些特定类型(如GameObjectTransform)不能被直接序列化。你需要将它们的状态转换为可以序列化的格式(如使用它们的位置、旋转和缩放属性)。
  • 序列化可能会影响性能,特别是在处理大量数据或复杂对象时。因此,在设计序列化策略时要考虑性能影响。
  • 安全性也是一个需要考虑的因素。确保你不会序列化敏感信息,并且在反序列化数据时验证其来源和完整性。

2. 自定义Inspector面板

使用场景

  • 在Unity编辑器中,特性可以用来自定义脚本组件在Inspector面板中的显示方式,提高开发效率。

例子分析

使用[Header][Tooltip][Range]等特性来改善Inspector面板的布局和交互性。

这个应该是可以在面板上看到这一组的字段,太多字段,不好阅读

2.1. 自定义属性与Inspector展示

使用场景

在Unity的Inspector面板中,特性可以用来控制自定义属性的显示和编辑方式,提高易用性。

例子分析

[HideInInspector]特性用于隐藏公共字段在Inspector面板中的显示,这对于那些不需要用户直接编辑的内部状态变量非常有用。

[Header]特性则用于在Inspector面板中为属性组添加标题,使得属性的组织更加清晰。

2.2. 编辑器扩展与自动化

使用场景

Unity的特性在编辑器扩展中起到了关键作用,允许开发者自定义编辑器的行为和外观,从而提供更为便捷的开发体验。

例子分析

[InitializeOnLoad]特性用于在编辑器启动时或脚本重新编译后自动执行指定的操作。这在初始化编辑器扩展、注册事件监听器或设置默认配置时非常有用。

(重要)3. 依赖注入和类型映射

使用场景

  • 在实现依赖注入或类型映射时,特性可以用来标记类或接口,以便在运行时解析和实例化对象。

例子分析

使用自定义特性来标记接口或类,并在运行时通过反射或其他机制来创建和配置对象。这常用于实现插件系统、模块化架构或解耦代码。

这个没有看懂????

在Unity中,依赖注入类型映射是两种重要的特性,它们有助于实现代码的解耦和重用,提高应用程序的可维护性和可扩展性。下面,我将通过具体的例子来讲解这两种特性。

3.1、依赖注入

依赖注入是一种将依赖关系(通常是对象或服务)从它们的客户端(通常是调用者)中分离出来,并由外部实体(如框架或容器)将它们注入到客户端中的技术。在Unity中,依赖注入通常通过构造函数注入属性注入方法注入来实现。

构造函数注入

构造函数注入为例,假设我们有一个游戏角色(Player)类,它依赖于一个武器(Weapon)类来进行攻击。我们可以这样设计这两个类:

--我持有你的引用,

--我的构造函数的时候(你的类 ){

                引用 = 你的类

        } //构造的时候,传入你的类

--我调用的时候{

           你的引用。你的方法()

}

通过这种方式,Player类不再需要负责创建Weapon对象,

它的职责被转移到了外部实体(这里是Unity的IoC容器)。

这使得Player类更加专注于自己的业务逻辑,同时也提高了代码的可测试性和可维护性。

属性注入

一、属性注入

属性注入是通过设置对象的公共属性来注入依赖的。在Unity中,你可以使用[Dependency]特性来标记需要注入的属性,然后在 容器配置时告诉Unity进行属性注入。

下面是一个属性注入的例子:

在这个例子中,MyService类有一个(接口)IMyDependency类型的属性MyDependency,它被标记为(被标记)[Dependency]

在Unity容器中注册MyService时,我们使用InjectionProperty来告诉Unity对MyDependency属性进行注入。

当解析MyService对象时,Unity会自动创建一个MyDependency的实例并将其注入到MyServiceMyDependency属性中。

方法注入

方法注入是通过调用对象的某个方法来注入依赖的。在Unity中,你可以使用InjectionMethod特性来指定需要注入的方法。

3.2、类型映射

类型映射在Unity中通常指的是将一种类型映射另一种类型,以便在解析时返回特定的实现。这类似于接口与实现之间的映射关系。在Unity中,我们可以使用RegisterType方法来实现类型映射。

例如,假设我们有一个ILogger接口和它的一个实现ConsoleLogger

将ILogger接口映射到ConsoleLogger实现 .

RegisterType<>()

Resolve<>

这些是什么东西????映射 解析 容器 ioc

通过这种方式,我们可以在不改变客户端代码的情况下替换ILogger的实现。例如,如果我们想将日志输出到文件而不是控制台,我们只需要创建一个新的日志实现(如FileLogger),并在Unity中更新映射关系即可:

这样,所有依赖ILogger的客户端代码都会自动使用新的FileLogger实现,而无需修改任何客户端代码。这大大提高了代码的可扩展性和可维护性。

4. 特殊行为控制

使用场景

  • 有些特性用于控制Unity的特殊行为,如场景加载、资源管理等。

例子分析

使用[PostProcessScene]特性来标记一个方法,使其在场景加载后自动执行某些操作,如初始化场景数据或设置特殊效果。

5. 调试和性能分析

使用场景

  • 特性也可以用于调试和性能分析,帮助开发者识别和解决问题。

例子分析

使用[Conditional]特性来标记一个方法,使其只在特定条件下编译和执行,通常用于调试目的。

6. 自定义编辑器窗口与工具

使用场景

通过特性,开发者可以创建自定义的编辑器窗口和工具,提供额外的功能或改进现有的工作流程。

例子分析

使用EditorWindow类结合特性可以创建自定义的编辑器窗口。这些窗口可以包含自定义的UI元素,用于执行特定的编辑任务。

7. 脚本编译与平台特定行为

使用场景

某些特性可以控制脚本的编译行为或针对特定平台的行为。

例子分析

[RequireComponent]特性用于自动为附加该特性的脚本组件添加其他组件。这在确保组件之间的依赖关系时非常有用。

 

MyMovementScript被附加到一个GameObject上时,Unity会自动为该GameObject添加一个Rigidbody组件(如果尚未存在)。

这些只是Unity特性的一些常见使用场景和例子。实际上,随着Unity的不断发展和社区的创新,特性的使用场景也在不断扩展。开发者可以根据具体需求和项目特点来选择合适的特性,以提高代码的可读性、可维护性和性能。

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

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

相关文章

Docker之存储配置与管理

一、容器本地配置与Docker存储驱动 每个容器都被自动分配了本地存储&#xff0c;也就是内部存储。容器由一个可写容器层和若干只读镜像层组成&#xff0c;容器的数据就存放在这些层中。 容器本地存储采用的是联合文件系统。这种文件系统将其他文件系统合并到一个联合挂载点&a…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

Spring boot + Redis + Spring Cache 实现缓存

学习 Redis 的 value 有 5 种常用的数据结构 Redis 存储的是 key-value 结构的数据。key 是字符串类型&#xff0c;value 有 5 种常用的数据结构&#xff1a; Redis 的图形化工具 Another Redis Desktop Manager Spring Data Redis Redis 的 Java 客户端。 Spring Cache Spr…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

Python_AI库 matplotlib扩展知识

Python_AI库 matplotlib扩展知识 在数据分析和处理的领域里&#xff0c;可视化是一种不可或缺的手段。通过图形化的展示&#xff0c;我们可以更直观地理解数据的分布、趋势和关系。而matplotlib&#xff0c;作为Python中最为流行的数据可视化库之一&#xff0c;以其强大的功能…

Anti Rookit -- 检测隐藏进程

Anti Rookit 一&#xff1a;检测隐藏进程 引言 检测隐藏进程除了众所周知的枚举进程ID之外&#xff0c;还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。 探究 应用层通过接口 C r e a t e P r o c e s s \textcolor{cornflowerblue}{CreateProcess} CreateProcess…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频 - Circle 阅读助手

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

【golang学习之旅】Go的 switch 分支语句

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】Go 的循环结构 【golang学习之旅】Go里面 if 条件判断语句 目录 系列文章switch 分支fallthrough 关键字无条件 switch switch 分支 有些时候需…

前端框架编译器之模板编译

编译原理概述 编译原理&#xff1a;是计算机科学的一个分支&#xff0c;研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言&#xff1a;Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码&#xff1a;机器码、汇…

如何使用 Internet Download Manager (IDM) 来加速和优化你的下载体验 IDM 6.41下载神器

在当今信息爆炸的时代&#xff0c;下载文件和媒体内容已成为我们日常生活的一部分。无论是工作学习还是娱乐休闲&#xff0c;我们都需要从互联网上下载各种资源。为了提高下载效率和确保文件完整性&#xff0c;选择一款优秀的下载管理软件至关重要。Internet Download Manager …

四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(OpenCvSharp)

功能实现&#xff1a; 对指定图片上进行绘制线段、矩形、圆、椭圆、自定义多边形、边缘轮廓以及自定义文本 一、布局 用到了一个pictureBox和八个button 二、引入命名空间 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.F…

用C实现通讯录(详细讲解+源码)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容会给大家带来通讯录的讲解&#xff0c;主要是利用结构体来实现通讯录&#xff0c;该通讯…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

【35分钟掌握金融风控策略13】单维度策略监控和调优

目录 单维度策略监控和调优 策略宏观监控和调优 项目运营报表 资产监控报表 客群质量监控报表 资产使用报表 项目风险报表 FSTPD逾期报表 迁徙率报表 Vintage报表 贷后催收报表 单维度策略监控和调优 若贷前授信审批环节上线的是基于决策树开发的多维度策略&#x…

html+css 选择器优先级

1.基本选择器优先级 id>class>tagname(标签选择器)>*(通配符选择器) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本选择器的优先级</title><style type"text/css"…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

锂电池SOH预测 | 基于LSTM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…