unity的特性AttriBute详解

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.rhkb.cn/news/314579.html

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

相关文章

同为办公领域系统,飞书和钉钉界面对比,你喜欢哪个?

钉钉 飞书 钉钉 飞书 钉钉 飞书 钉钉 飞书 钉钉 飞书 钉钉 飞书

codePen按钮样式学习

前言 看到codepen里面有的按钮搞得很炫酷&#xff0c;但其实也不是很难&#xff0c;就学习记录一下 逐渐出现边框 大体上来说就是当鼠标悬浮的时候触发四个transition&#xff0c;用after、before和span的after和before四个伪类做hover出来的边框 <div class"btn bt…

如何使用IDEA直接连接MySQL数据库

如何使用IDEA直接连接MySQL数据库 新建一个空项目打开DataBase窗口连接数据库第一次连接 需要先下载驱动上一步驱动下载太慢怎么办&#xff1f;下载好驱动后 测试连接 新建一个空项目 打开DataBase窗口 连接数据库 第一次连接 需要先下载驱动 如果这里下载的很慢 看下一步解决…

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

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

Restful API 具体设计规范(概述)

协议 https 域名 https://www.baidu.com/api 版本 https://www.baidu.com/v1 路径 https://www.baidu.com/v1/blogs 方法 数据过滤 状态码返回结果 返回的数据格式 尽量使用 JSON&#xff0c;避免使用 XML。 总结&#xff1a; 看 url 就知道要什么看 http method 就知道干…

盲人辅助软件出行:实时避障与拍照识别技术引领视障人士走向独立

在数字化时代&#xff0c;一款名为蝙蝠避障的专为盲人朋友开发的盲人辅助软件正在以其独特功能悄然改变着盲人朋友们的出行方式&#xff0c;让盲人辅助软件的实用性和智能化程度迈上了新的台阶。 这款专门针对盲人出行需求定制的应用程序&#xff0c;聚焦于解决盲人在导航过程中…

多路递归的一些算法题

前言 首先我想讲一下&#xff0c;我对多路递归的理解吧&#xff0c;我认为多路递归就是循环中套回调&#xff0c;对于循环有几次就是几叉树&#xff0c;就好比我们常用的二叉树的dfs(node.left) 和 dfs(node.right)等前中后序遍历&#xff0c;也就是for (int i 0; i < 2; …

HTTP网络协议的请求方法,具体详解(2024-04-26)

1、HTTP 即超文本传输协议&#xff0c;是一种实现客户端和服务器之间通信的响应协议&#xff0c;它是用作客户端和服务器之间的请求 根据 HTTP 标准&#xff0c;HTTP 请求可以使用多种请求方法。 2、方法分类 HTTP1.0 定义了三种请求方法&#xff1a; GET, POST 和 HEAD 方…

HarmonyOS开发案例:【 自定义弹窗】

介绍 基于ArkTS的声明式开发范式实现了三种不同的弹窗&#xff0c;第一种直接使用公共组件&#xff0c;后两种使用CustomDialogController实现自定义弹窗&#xff0c;效果如图所示&#xff1a; 相关概念 [AlertDialog]&#xff1a;警告弹窗&#xff0c;可设置文本内容和响应回…

数据分析专家能力模型

招式&#xff1a;懂商业&#xff08;业务能力&#xff09; 外功更偏重于技能&#xff0c;首先需要懂招式&#xff0c;即懂商业&#xff0c;数据分析最终是为业务服务的&#xff0c;无论是互联网企业准求的用户增长和UJM分解&#xff0c;还是传统企业追求的降本增效和精细化运营…

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

优化贪吃蛇在前进过程中,前进和后退的问题

1. 左边为head,右边为tail 定义相反数在abs&#xff08;&#xff09;绝对值函数中实现 2. 在转向函数turn()中&#xff0c;如果绝对值不相等的时候才赋予方向的值 3.贪吃蛇吃食物的思路 3.1 初始化食物initFood(), 蛇碰到食物函数hasFood&#xff08;&#xff09;,在移…

DeepFaceLab小白教程:视频换脸过程

合适那些人阅读&#xff1f; 适合从未使用过DeepFaceLab的群体。 如果你想基于DeepFaceLab完成一次视频换脸的操作&#xff0c;可以看本篇。 下载方式 GitHub https://github.com/iperov/DeepFaceLab 我是用motrix下载。 网盘 https://pan.baidu.com/share/init?surlO4…

21.Nacos集群搭建

模拟Nacos三个节点&#xff0c;同一个ip,启动三个不同的端口&#xff1a; 节点 nacos1, 端口&#xff1a;8845 节点 nacos2, 端口&#xff1a;8846 节点 nacos3, 端口&#xff1a;8847 1.搭建数据库&#xff0c;初始化数据库表结构 这里我们以单点的数据库为例 首先新建一…

TDSQL手动调整备份节点或冷备节点

一、背景描述 近期TDSQL数据库备份不稳定&#xff0c;有些set实例的备份任务未自动发起。经排查分析&#xff0c;存在多个set实例容量已经超过TB级别&#xff0c;且冷备节点都是同一台。因此&#xff0c;需要手动将当前备份节点改到其他备节点&#xff0c;开启增量备份&#x…

动静态库以及动态链接

文章目录 静态库制作静态库如何使用静态库 动态库动态库的制作动态库的使用动态链接 库是给别人用的&#xff0c;所以库中一定不存在main函数。库一般会有lib前缀和后缀&#xff0c;去掉前缀和后缀才是库名。 静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译…

引入线程的贪吃蛇风骚走位

1.在main函数中分别引入线程t1 和线程 t2 一个线程用来刷新界面&#xff0c;一个线程用来改变方向 2.刷新界面函数&#xff0c;无限次刷新 3. 也是无限循环while(1) 定义key 从键盘获取输入方向&#xff0c;赋值给dir; 4.在初始化函数中确定蛇向有行走为方向 5.从改变方向的函数…

ESLint 、 e2e test 学习

Lint和Format的区别&#xff1a; Lint只会告诉你代码中的错误或者不符合规范的地方&#xff0c;而Format是用来对格式作调整的 HTML/tpl&#xff1a;HTMLLint CSS/SCSS&#xff1a;Stylelint JS/JSX&#xff1a;Eslint JSLint&#xff1a;古老&#xff0c;不能配置和扩展JSHin…

CentOS安装CRI--containerd

前言 CRI&#xff0c;Container Runtimes&#xff0c;通常直译成容器进行时因为kubernetes&#xff0c;从1.24开始&#xff0c;移除了Dockershim&#xff0c;需要额外安装CRI&#xff0c;保障Pod能顺利运行。网上有很多容器进行时的工具&#xff0c;本文采用containerd工具。 …

Vue 使用Canvas画布手写电子版签名 保存 上传服务端

电子版签名效果 定义画布 <canvas width"500"height"250"ref"cn"mousedown"cnMouseDown"mousemove"cnMouseMove"mouseup"cnMouseUp"style"width:500px;height: 250px;background-color:snow;padding: 10p…