CocosCreator3.8研究笔记(六)CocosCreator 脚本装饰器的理解


一、什么是装饰器?


装饰器是TypeScript脚本语言中的概念。

TypeScript的解释:在一些场景下,我们需要额外的特性来支持标注或修改类及其成员。装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。


在TypeScript中,装饰器分为:类装饰器、属性装饰器、方法装饰器、方法参数装饰器。


由此可知:

  • 装饰器的作用:标注或修改类及其成员
  • 装饰器作用的目标:类及其成员(类,方法, 访问符,属性或参数)

大家都知道,从Cocos Creator3.x 开始,开发语言主要是:TypeScript,那么装饰器也是需要必须理解的。


二、CocosCreator 的装饰器


在理解CocosCreator 的装饰器之前,我们需要先了解几个知识点:CocosCreator序列化Cocos Creator 的脚本编译时机CocosCreator装饰器执行时机


  • CocosCreator序列化: 编辑器中设置好了属性,会被保存到资源文件中,在使用的时候,自动还原成设置好的属性。这就是CocosCreator的序列化。

  • 脚本编译时机: 在前面介绍vs code 脚本编辑工具的时候,我们也有介绍到 ,脚本编译的时机:修改项目脚本后,重新返回 Cocos Creator 会自动的触发脚本编译。然后我们也配置了 VS Code 编译任务, 配置完成后,在VS Code 中按下快捷键 Ctrl + Shift + B 便会自动显示 CocosCreator compile,执行即可编译。

感兴趣的朋友请前往查看CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置。


  • 装饰器执行时机:装饰器对类行为的改变,是代码编译时发生的,而不是在运行时。也就是说,装饰器的本质就是编译时执行的函数。

1、CC 类


(1)、什么是cc类?

将ccclass 关键词做为注解,添加在类上时,这个类被称为CC类。


语法如下:

@ccclass('name')  

如图,PlayerControl 为cc类:


在这里插入图片描述


(2)、CC 类的作用

CC 类注入了控制cocos creator 对该类对象的序列化、编辑器对此类对象的显示。


(3)、CC 类注意事项

  • CC类的名称是唯一的

  • 不能以 cc.internal. 作为前缀,这是 Cocos Creator 的保留类名前缀

  • 没声明 ccclass 的组件类,无法作为组件添加到节点上

  • 当CC类是组件时,Node 可以通过组件类的CC类名查找到该组件


2、组件类装饰器

组件类装饰器只能用来修饰 Component 的子类。


(1)、executeInEditMode

正常情况下,所有组件只会在运行时执行, 在编辑器模式下并不会触发,executeInEditMode 默认值为 false

如果需要在编辑器模式下就执行,我们可以将executeInEditMode 设置为’true’,表示允许在编辑器模式下运行。


如下代码:

const { ccclass, executeInEditMode } = _decorator;
@ccclass('Example')
@executeInEditMode(true)
export class Example extends Component {update (dt: number) {// 在编辑器下每帧执行}
}

(2)、requireComponent

requireComponent 参数用来指定当前组件的依赖组件,默认值为 null

当组件添加到节点上时,如果依赖的组件不存在,引擎会自动将依赖组件添加到同一个节点,防止脚本出错。


const { ccclass, requireComponent } = _decorator;@ccclass('Example')
@requireComponent(Sprite)
export class Example extends Component {
}

(3)、executionOrder

executionOrder 用来指定脚本生命周期回调的执行优先级。

该优先级设定只对 onLoadonEnablestartupdatelateUpdate 有效,对 onDisableonDestroy 无效。

  • 对于同一节点上的不同组件,数值小的先执行,数值相同的按组件添加先后顺序执行
  • 对于不同节点上的同一组件,按节点树排列决定执行的先后顺序。

const { ccclass, executionOrder } = _decorator;@ccclass('Example')
@executionOrder(3)
export class Example extends Component {
}

(4)、disallowMultiple

同一节点上只允许添加一个同类型(含子类)的组件,防止逻辑发生冲突,默认值为 false。

const { ccclass, disallowMultiple } = _decorator;@ccclass('Example')
@disallowMultiple(true)
export class Example extends Component {
}

(5)、menu

@menu(path) 用来将当前组件添加到组件菜单中。

该菜单:是添加在 属性检查器 面板中按下添加组件按钮后的下拉框内。


在这里插入图片描述


在这里插入图片描述


const { ccclass, menu } = _decorator;@ccclass('Example')
@menu('foo/bar')
export class Example extends Component {
}

(6)、help

指定当前组件的帮助文档的 URL。

设置完成后,在 属性检查器 中就会出现一个帮助图标,点击即可打开帮助文档的 URL。


const { ccclass, help } = _decorator;
@ccclass('Example')
@help('https://docs.cocos.com/creator/3.8/manual/zh/scripting/decorator.html')
export class Example extends Component {
}

3、属性装饰器(property)

属性装饰器用于控制 Cocos Creator 编辑器中对该属性的序列化、属性检查器 中对该属性的展示等。


属性装饰器 property 可以被应用在 cc 类的属性或访问器上。


(1)、属性编辑器常见属性类型

  • 基础属性:CCInteger、CCFloat、CCBoolean、CCString

  • cc 类型

  • 数组类型:[CCInteger]、[Node]


当使用基础属性类型或者 cc 类作为数组元素时,将分别以整数数组和节点数组的形式在 属性检查器 中展示。


  • 若值的类型是 JavaScript 原始类型 numberstringboolean,则其类型分别对应 Creator 的CCFloatCCStringCCBoolean

语法如下:

@property({ type:Node,visible:true})@property({type:CCInteger,visible:true})
n:number=5;@property({ type:[Node],visible:true})

下图是脚本文件 PlayerControl.ts 与Creator 编辑器属性检查器中属性展示:

在这里插入图片描述


Cocos Creator额外提供几种装饰器可以快速声明 cc 类型。

装饰器对应的 property 写法
@type(t)@property(t)
@integer@property(CCInteger)
@float@property(CCFloat)


以下声明,可以替代 @property 的写法:

@integer // 声明属性的 cc 类型为整数
index = 0;@type([Node]) // 声明属性 children 的 cc 类型为 Node 数组
children: Node[] = [];@type(String) // 警告:不应该使用构造函数 String。等价于 CCString。也可以选择不声明类型
text = '';

(2)、属性检查器中属性的可见性


需要注意的是:不是所有定义的属性装饰器都是可见的,在以下两种情况,是不会显示在属性检查器:

  • 属性名是否以 _ 开头 ,会识别为 private 属性,private 属性不会在编辑器组件属性面板上显示。
  • visible属性值为false

(3)、序列化(serializable)


属性默认情况下都会被序列化,序列化后就会将编辑器中设置好的属性值保存到场景等资源文件中,之后在加载场景时就会自动还原成设置好的属性值。如果不想序列化,可以设置 serializable: false。

@property({ serializable: false })
num = 0;

(4)、override

所有属性都会被子类继承,如果子类要覆盖父类同名属性,需要显式设置 override 参数,否则会有重名警告:

@property({ tooltip: "my id", override: true })
id = "";

(5)、group

当脚本中定义的属性过多且杂时,可通过 group 对属性进行分组、排序,方便管理。

同时还支持对组内属性进行分类。


group 写法包括以下两种:

@property({ group: { name } })
@property({ group: { id, name, displayOrder, style } })


参数说明
id分组 ID,string 类型,是属性分组组号的唯一标识,默认为 default
name组内属性分类的名称,string 类型。
displayOrder对分组进行排序,number 类型,数字越小,排序越靠前。默认为 Infinity,表示排在最后面。 若存在多个未设置的分组,则以在脚本中声明的先后顺序进行排序。
style分组样式,目前支持 tabsection 样式。 默认为 tab

(6)、get/set 使用

@property
_num:number=1;
set num(val){this._num=val;
}
get num(){return this._num;
}

(7)、Cocos Creator 常用内置属性

  • Color(颜色)
  @property(Color)color:Color
  • Gradient (渐变)
  @property(Gradient)gradient = new Gradient();
  • GradientRange (渐变色范围)

通过颜色、渐变色、双颜色或双渐变色控制颜色

  @property(GradientRange)gradientRange:GradientRange = new GradientRange();

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

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

相关文章

Linux基础知识及常见指令

Linux简介及相关概念 什么是Linux? Linux是一个免费开源的操作系统内核,最初由Linus Torvalds于1991年创建。它是各种Linux发行版(通常称为“发行版”)的核心组件,这些发行版是完整的操作系统,包括Linux内…

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧: 多帧传输 FF(首帧): CF(连续帧): FC(流控帧): 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…

C中的基本函数

1函数是是什么 1.1维基百科中对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成,他负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输…

浅析安防视频监控平台EasyCVR视频融合平台接入大量设备后是如何维持负载均衡的

安防视频监控平台EasyCVR视频融合平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备…

【C++】学习STL中的list

❤️前言 大家好!,今天为大家带来的一篇博客是关于STL中的list,内容主要包括list的介绍使用、list的模拟实现。以及list与vector的对比。 正文 list的介绍和使用 首先,让我们看看list的文档介绍: list是可以在常数范…

LabVIEW检测润滑油中的水分和铁颗粒

LabVIEW检测润滑油中的水分和铁颗粒 润滑油广泛应用于现代机械设备,由于工作环境日益恶劣,润滑油经常被水分乳化,加速对机械设备的腐蚀。此外,润滑油还受到机械零件摩擦中产生的Fe颗粒的污染,削弱了其机械润滑效果。润…

微服务-gateway基本使用

文章目录 一、前言二、gateway网关1、什么是微服务网关?2、微服务架构下网关的重要性2.1、没有网关2.2、有网关 3、gateway的功能4、gateway实战4.1、依赖配置4.2、添加网关配置4.3、添加网关启动类4.4、查看项目是否启动成功4.5、验证路由配置是否正确 三、总结 一…

设备管理系统的优势是什么?设备管理系统对企业运营管理有什么帮助?

传统的设备报修维护方式存在一些问题,例如指派传递速度慢和故障信息不准确等。然而,使用设备管理系统就可以轻松地解决这些问题,并且报修全流程只需短短的30秒。设备管理系统具有许多优势,首先它支持多种渠道的报修,包…

视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级

视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎,针对C#和Unity进行了高度优化,使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案,将Tween动画应用于Unity Objects的各个方面,并可以通过E…

MySQL——索引

索引在 MySQL 数据库中分三类: B 树索引Hash 索引全文索引 目的:在查询的时候提升效率 b树 参考:https://blog.csdn.net/qq_40649503/article/details/115799935 数据库索引,是数据库管理系统中一个排序的数据结构&#xf…

Linux之Shell概述

目录 Linux之Shell概述 学习shell的原因 shell是什么 shell起源 查看当前系统支持的shell 查看当前系统默认shell Shell 概念 Shell 程序设计语言 Shell 也是一种脚本语言 用途 Shell脚本的基本元素 基本元素构成: Shell脚本中的注释和风格 Shell脚本编…

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像,但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…

postgresql-常用日期函数

postgresql-常用日期函数 简介计算时间间隔获取时间中的信息截断日期/时间创建日期/时间获取系统时间时区转换 简介 PostgreSQL 提供了以下日期和时间运算的算术运算符。 获取当前系统时间 select current_date,current_time,current_timestamp ;-- 当前系统时间一周后的日…

C语言“牵手”拼多多商品详情数据方法,拼多多商品详情API接口,拼多多API申请指南

拼多多是中国最大的自营式电商企业,在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 拼多多平台的商品…

Linux之history、tab、alias、命令执行顺序、管道符以及exit

目录 Linux之history、tab、alias、命令执行顺序、管道符以及exit history历史命令 格式 参数 修改默认记录历史命令条数 案例 案例1 --- 显示history历史记录中出现次数最高的top10 案例2 --- 增加history显示的时间信息 命令与文件名补全 --- tab 命令别名 格式 案…

16 “count(*)“ 和 “count(1)“ 和 “count(field1)“ 的差异

前言 经常会有面试题看到这样的问题 “ select count(*) ”, “ select count(field1) ”, “ select count(1) ” 的效率差异啥的 然后 我们这里 就来探索一下 这个问题 我们这里从比较复杂的 select count(field1) 开始看, 因为 较为复杂的处理过程 会留一下一些关键的调试…

Briefings in Bioinformatics2021 | Bert-Protein+:基于Bert的抗菌肽识别

论文标题:A novel antibacterial peptide recognition algorithm based on BERT 论文地址:novel antibacterial peptide recognition algorithm based on BERT | Briefings in Bioinformatics | Oxford Academic 代码:https://github.com/B…

【笔记】大模型时代下做科研的四个思路 - 论文精读·52

视频地址:大模型时代下做科研的四个思路 相关大模型 CV: ViT(22B) , ViT-G(2B) from google 多模态:ViT-E(4B) from google NLP:LLaMA(70B,130B,330B,651B) from Meta 提问:在模型越来越大的时代背景下,如何利用有限…

Maven编译java及解决程序包org.apache.logging.log4j不存在问题

1、首先新建一个文件夹&#xff0c;比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…