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.mzph.cn/diannao/4672.shtml

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

相关文章

Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)

IDE(编辑器)报错 循环引用泛型是我起的名字&#xff0c;不知道官方的名字是什么。这个问题是我在定义Android 的MVP时提出来的。具体是什么样的呢&#xff1f;我们看一下我的基础的MVP定义&#xff1a; interface IPresenter<V> { fun getView(): V }interface IVie…

Nodejs 第六十八章(远程桌面)

远程桌面 远程桌面&#xff08;Remote Desktop&#xff09;是一种技术&#xff0c;允许用户通过网络远程连接到另一台计算机&#xff0c;并在本地计算机上控制远程计算机的操作。通过远程桌面&#xff0c;用户可以在不同地点的计算机之间共享屏幕、键盘和鼠标&#xff0c;就像…

宝塔面板安装教程(linux)

宝塔官网地址 宝塔官网linux安装地址 针对Ubuntu系统的安装命令&#xff1a; wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装过程中&#xff0c;中途会出现一个 Y&N ? 的选项&#xf…

OpenCV如何模板匹配

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投 下一篇 &#xff1a;OpenCV在图像中寻找轮廓 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

如何下载AndroidStudio旧版本

文章目录 1. Android官方网站2. 往下滑找到历史版本归档3. 同意软件下载条款协议4. 下载旧版本Androidstudio1. Android官方网站 点击 Android官网AS下载页面 https://developer.android.google.cn/studio 进入AndroidStuido最新版下载页面,如下图: 2. 往下滑找到历史版本归…

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航&#xff0c;AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展&#xff0c;我们正站在一个新的转折点上&#xff…

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

[论文笔记]GAUSSIAN ERROR LINEAR UNITS (GELUS)

引言 今天来看一下GELU的原始论文。 作者提出了GELU(Gaussian Error Linear Unit,高斯误差线性单元)非线性激活函数&#xff1a; GELU x Φ ( x ) \text{GELU} x\Phi(x) GELUxΦ(x)&#xff0c;其中 Φ ( x ) \Phi(x) Φ(x)​是标准高斯累积分布函数。与ReLU激活函数通过输入…

网盘—上传文件

本文主要讲解网盘里面关于文件操作部分的上传文件&#xff0c;具体步骤如下 目录 1、实施步骤&#xff1a; 2、代码实现 2.1、添加上传文件协议 2.2、添加上传文件槽函数 2.3、添加槽函数定义 2.4、关联上传槽函数 2.5、服务器端 2.6、在服务器端添加上传文件请求的ca…

算法学习(5)-图的遍历

目录 什么是深度和广度优先 图的深度优先遍历-城市地图 图的广度优先遍历-最少转机 什么是深度和广度优先 使用深度优先搜索来遍历这个图的过程具体是&#xff1a; 首先从一个未走到过的顶点作为起始顶点&#xff0c; 比如以1号顶点作为起点。沿1号顶点的边去尝试访问其它未…

提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票

引言 五一假期作为中国的传统节日&#xff0c;也是旅游热门的时段之一&#xff0c;特价机票往往成为人们关注的焦点。在这个数字化时代&#xff0c;利用爬虫技术获取特价机票信息已成为一种常见的策略。通过结合C#和Fizzler库&#xff0c;我们可以更加高效地实现这一目标&…

2024年---蓝桥杯网络安全赛道部分WP

一、题目名称&#xff1a;packet 1、下载附件是一个流量包 2、用wireshark分析&#xff0c;看到了一个cat flag的字样 3、追踪http数据流&#xff0c;在下面一行看到了base64编码。 4、解码之后得到flag 二、题目名称&#xff1a;cc 1、下载附件&#xff0c;打开是一个html …

Docker构建LNMP部署WordPress

前言 使用容器化技术如 Docker 可以极大地简化应用程序的部署和管理过程&#xff0c;本文将介绍如何利用 Docker 构建 LNMP 环境&#xff0c;并通过部署 WordPress 来展示这一过程。 目录 一、环境准备 1. 项目需求 2. 安装包下载 3. 服务器环境 4. 规划工作目录 5. 创…

CAPS Wizard for Mac:打字输入辅助应用

CAPS Wizard for Mac是一款专为Mac用户设计的打字输入辅助应用&#xff0c;以其简洁、高效的功能&#xff0c;为用户带来了全新的打字体验。 CAPS Wizard for Mac v5.3激活版下载 该软件能够智能预测用户的输入内容&#xff0c;实现快速切换和自动大写锁定&#xff0c;从而大大…

OmniReader Pro for Mac:强大且全面的阅读工具

OmniReader Pro for Mac是一款专为Mac用户设计的强大且全面的阅读工具&#xff0c;它集阅读、编辑、管理等多种功能于一身&#xff0c;为用户提供了卓越的阅读体验。 OmniReader Pro for Mac v2.9.5激活版下载 该软件支持多种文件格式的阅读&#xff0c;包括PDF、Word、Excel、…

pycharm配置wsl开发环境(conda)

背景 在研究qanything项目的过程中&#xff0c;为了进行二次开发&#xff0c;需要在本地搭建开发环境。然后根据文档说明发现该项目并不能直接运行在windows开发环境&#xff0c;但可以运行在wsl环境中。于是我需要先创建wsl环境并配置pycharm。 wsl环境创建 WSL是“Windows Su…

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

1、《一本书讲透 Elasticsearch》销售最近进展汇报 给大家同步一下《一本书讲透 Elasticsearch》图书的进展情况&#xff0c;本周五&#xff08;2024年4月26日&#xff09;&#xff0c;出版社编辑老师反馈图书相关销量进展&#xff1a; 预计全网销量 1000 册&#xff0c;发货量…

OpenHarmony语言基础类库【@ohos.xml (xml解析与生成)】

将XML文本转换为JavaScript对象、以及XML文件生成和解析的一系列接口。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import xml from ohos.xml; XmlSerializer XmlSerializer接口…

FPGA实现图像处理之【直方图均衡-寄存器版】

FPGA实现直方图统计 一、图像直方图统计原理 直方图的全称为灰度直方图&#xff0c;是对图像每一灰度间隔内像素个数的统计。即对一张图片中每隔二灰度值的像素数量做统计&#xff0c;然后以直方图的形式展现出来。图下的亮暗分布在直方图中就可以一目了然&#xff0c;直方图…

Spark核心名词解释与编程

Spark核心概念 名词解释 1)ClusterManager&#xff1a;在Standalone(上述安装的模式&#xff0c;也就是依托于spark集群本身)模式中即为Master&#xff08;主节点&#xff09;&#xff0c;控制整个集群&#xff0c;监控Worker。在YARN模式中为资源管理器ResourceManager(国内…