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.mfbz.cn/a/570454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react,Chart

一、基础图&#xff1a;https://ant-design-charts.antgroup.com/ Ant Design Charts 1. 首先要下载ant-design/charts&#xff0c;然后在页面中添加如下柱状图代码: import React from react; import { Column } from ant-design/chartsconst DemoColumn: React.FC () …

深度学习算法简介(一)

目录 ⛳️推荐 前言 1、深度神经网络&#xff08;DNN&#xff09; 2、卷积神经网络&#xff08;CNN&#xff09; 3、残差网络&#xff08;ResNet&#xff09; 4、LSTM&#xff08;长短时记忆网络&#xff09; 5、Word2Vec 6、Transformer 7、生成对抗网络&#xff08;…

Laravel 6 - 第十三章 请求

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

深度学习之CNN

目录 我们为什么要用CNN&#xff0c;或者说究竟是因为什么我们要用CNN 卷积操作的实现原理 补充知识 torch.nn.Conv2d&#xff08;&#xff09; 注意 torch.nn.functional.conv2d&#xff08;&#xff09; torch.nn.functional.conv2d&#xff08;&#xff09;和torch.nn.…

tokio多任务绑定cpu(绑核)

tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢&#xff1f; 首先我们先写一段简单的多任务程序。 use tokio; use tokio::runtime; use core_affinity;fn tokio_sample() {let rt runtime::Builde…

【漏洞复现】云时空社会化商业ERP系统slogin SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统slogin存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a; …

GaussDB 数据导入导出工具介绍

本节课程一起来学习一下GaussDB数据库的导入导出。 目录 一、数据导入导出场景划分 1. gsql工具适用场景和使用方法 2. copy使用场景和使用方法 3.gs_dump工具使用方法 4. gs_restore工具使用方法 二、gs_loader介绍 1. 工具介绍 2.创建系统表和数据表 3.创建控制文…

mat转为txt的double数据||无截断误差保存多位小数

前情提要 需要将86400021的.mat数据存为visual studio可用的格式&#xff0c;主要是.csv数据或.txt数据 方法大概三种&#xff0c;一&#xff1a;csvwrite&#xff1b;二&#xff1a;save为txt&#xff1b;三&#xff1a;fprintf 一&#xff1a;csvwrite 1 csvwrite(ga_mat.…

Git merge的版本冲突实验

实验目的 发现 两个分支的 相同文件 怎样被修改 才会发生冲突&#xff1f; 实验过程 1.初始状态 现在目前有1.py、2.py两个文件&#xff0c;已经被git管理。现在我想制造冲突&#xff0c;看怎样的修改会发生冲突&#xff0c;先看怎么不会发生冲突。 目前仓库里的版本是这样…

简述大模型领域的CVP架构和RAG架构的区别

大模型领域的CVP&#xff08;ChatGPT VectorDB Prompt&#xff09;架构&#xff0c;是否等同于RAG增强式搜索。 首先&#xff0c;CVP是特指一个聊天系统相关的架构&#xff0c;即&#xff1a; ChatGPT&#xff1a;基于GPT模型的聊天机器人技术。 VectorDB&#xff1a;向量数…

【声呐仿真】学习记录0-服务器配置docker、ros环境

【声呐仿真】学习记录0-服务器配置docker、ros环境 前言一、~~0.设置mobaXterm~~1.拉取镜像2.服务器开启xhost&#xff0c;可视化&#xff08;rviz、gazebo&#xff09;3.创建容器&#xff0c;挂载数据卷4.测试宿主机与容器数据是否同步5.测试5.0测试xclock5.1测试ros小乌龟5.2…

bayesplot|分享一个可视化贝叶斯模型的R包

1.bayesplot介绍 该包主要用于贝叶斯模型的可视化分析&#xff0c;提供了一系列工具来帮助评估、理解和诊断贝叶斯模型。这个包特别适用于与 Stan 以及其他提供 MCMC 样本的软件如 JAGS 和 BUGS 的模型输出。 后验分布图:包括密度图、直方图和区间图&#xff0c;用于展示模型…

微信小程序和公众号打通,实现用户关注公众号送优惠券

前提 小程序 公众号 微信开放平台 小程序和公众号都需要绑定到同一个微信开放平台,因为要获取Unionid&#xff0c;unionid是什么 如果开发者拥有多个移动应用、网站应用、和公众账号&#xff08;包括小程序&#xff09;&#xff0c;可通过 UnionID 来区分用户的唯一性&#xf…

【Linux】驱动_2_字符驱动

1. Linux设备分类 字符设备: 指应用程序按字节/字符来读写数据的设备。通常为传真、虚拟终端和串口调制解调器、键盘之类设备提供流通信服务&#xff0c;通常不支持随机存取数据。字符设备在实现时大多不使用缓存器。系统直接从设备读/写每一个字符。块设备: 通常支持随机存取…

Jenkins 打包报错记录 error: index-pack died of signal 15

问题背景&#xff0c;打包每次到92%时就会报错&#xff0c;试了好几次都是同样的错误 14:56:53 fatal: index-pack failed 14:56:53 14:56:53 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2734) 14:56:53 at org.jenkinsci.plugi…

GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程

目录 ⛳️推荐 1. 安装配置GoLand 2. 服务器开启SSH服务 3. GoLand本地服务器远程连接测试 4. 安装cpolar内网穿透远程访问服务器端 4.1 服务器端安装cpolar 4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&am…

【复现】金和OA-jc6 RCE漏洞_74

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 金和C6协同管理平台包括协同办公管理,人力资源管理,项目管理,客户关系管理,企业目标管理,费用管理,移动办公,微信办公等多个业务范…

Java——内存溢出如何排查

1、模拟内存移除场景 public class OOMTest {public static void main(String[] args) {List<byte[]> memoryLeakArray new ArrayList<>();for (int i 0; i<1024; i){byte[] bytes new byte[1024 * 1024];memoryLeakArray.add(bytes);}} }初始化启动参数最大…

小心!那个走了的员工可能带走了公司的秘密

数据泄露是企业安全的一大隐患&#xff0c;尤其是离职员工带走公司数据的问题&#xff0c;这是一种常被忽视的内部威胁。离职员工可能因为种种原因&#xff0c;带走了他们曾经可以访问的公司数据。而这些数据如果落入了不当的地方&#xff0c;可能会给企业带来严重的损害。那么…

力扣数据库题库学习(4.24日)

1068. 产品销售分析 I 问题链接 思路分析 编写解决方案&#xff0c;以获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。返回结果表 无顺序要求 。 这个问题很简单&#xff0c;查询两张表内的指定字段。这个考的其实就是数据库的连接&am…
最新文章