Cocos Creator3.x 必备技能-装饰器

前言

最近菜鸟在开发中使用到了Cocos Creator的装饰器,菜鸟周末花了点时间大概整理了一下,长话短说,直接见正文。

正文

1.TypeScript装饰器

首先咱们来了解一下TypeScript对装饰器的解释:在一些场景下我们需要额外的特性来支持标注或修改类及其成员。 装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。
「从上边的解释中 我们可以提取到几个关键点:」

  • 作用:标注或修改类及其成员

  • 作用目标:类及其成员(类,方法, 访问符,属性或参数)

继续往下了解,我们可以了解到TypeScript装饰器大概存在:「类装饰器,属性装饰器,方法装饰器,方法参数装饰器」这几种。有关TypeScript装饰器的相关内容,小伙伴们可以自己百度奥。

2.Cocos Creator 中的装饰器

这才是咱们今天讨论的重点。

正在上传…重新上传取消 从Cocos Creator3.x 编程语言TypeScript成为其主要的开发语言开始,装饰器就成了大家必须要了解的,菜鸟在多次面试过程中也被问到了。
大家可以先了解一下「序列化」 「Cocos Creator 的脚本编译时机」「装饰器执行时机」

  • 「序列化:」默认情况会将编辑器中设置好的属性值保存到场景等资源文件中,之后在加载场景时就会自动还原成设置好的属性值。

  • 「脚本编译时机:」小伙伴们可能都发现了,我们在外部脚本编辑器修改项目脚本后,重新返回 Cocos Creator 会自动的触发脚本编译。

  • 「装饰器执行时机」:修饰器对类的行为的改变,是代码编译时发生的(不是TypeScript编译,而是js在执行机中编译阶段),而不是在运行时。这意味着,修饰器能在编译阶段运行代码。也就是说,修饰器本质就是编译时执行的函数。

1.基本用法

组件类装饰器(executeInEditMode)

正常情况下,所有组件都只会在运行时执行,也就是说它们的生命周期回调在编辑器模式下并不会触发。如果需要在编辑器模式下就执行,可以使用组件类装饰器

属性装饰器(property)

属性编辑器的常见属性类型:

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

  • cc 类型

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

可见性

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

  • 属性名是否以 _ 开头

  • visible属性值为false

序列化(serializable)

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

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

get/set 使用

@property
_num:number=1;
@property({type:CCInteger,tooltip:"提示内容"})
set num(val){
    this._num=val;
}
get num(){
    return this._num;
}

以上内容将一些简单的,最常用的基本用法进行介绍,详细内容可以自行参考官方文档。

2.更多用法

下拉列表

滑动条

@property({type:CCFloat,slide:true,max:1.0,min:0.0,step:0.01})
slide:number=0.5;

自定义样式

样式1

样式2

样式3

enum Type {
    one = 1,
    two = 2,
    three = 3,
    four = 4,
    five = 5,
}
Enum(Type);
@ccclass('Test4')
@executeInEditMode(true)
export class Test4 extends Component {
    @property
    _type: Type = Type.one;
    @property({ type: Type })
    get type() {
        return this._type;
    }
    set type(val) {
        this._type = val;
        this.setType(val);
    }
    @property
    _num: number = 10;
    @property({
        type: CCInteger, visible: function (this) {
            return this.isShowNum;
        }
    })
    get num() {
        return this._num;
    }
    set num(val) {
        this._num = val;
    }
    @property
    _str: string = "你好";
    @property({
        visible: function (this) {
            return this.isShowString;
        }
    })
    get str() {
        return this._str;
    }
    set str(val) {
        this._str = val;
    }

    @property
    _bool: boolean = true;
    @property({
        visible: function (this) {
            return this.isShowBool;
        }
    })
    get bool() {
        return this._bool;
    }
    set bool(val) {
        this._bool = val;
    }
    private isShowNum = false;
    private isShowString = false;
    private isShowBool = false;
    private setType(val): void {
       ...
    }

    onLoad() {
        console.log("onLoad");
    }
}

demo 链接

公众号回复:"装饰器"

往期内容

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿越的杨宗宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值