CocosCreator3.8研究笔记(四)CocosCreator 脚本说明及使用(上)

news2024/11/29 2:42:35

在Cocos Creator中,脚本代码文件分为模块和插件两种方式:

  • 模块一般就是项目的脚本,包含项目中创建的代码、引擎模块、第三方模块

  • 插件脚本,是指从 Cocos Creator 属性检查器中导入的插件,一般是引入第三方引入库文件,目前 Cocos Creator 只支持 javaScript 脚本插件。Cocos Creator会向插件脚本内容中,插入一些代码,适配Creator,并且会屏蔽全局变量 model 、exports 、define 。

由于篇幅原因,CocosCreator 脚本说明及使用分为上、下两篇进行介绍, 这篇文章主要介绍脚本模块,下一篇结束插件脚本。


一、模块的概念


在目前前端开发中,模块化已成为一种不可或缺的开发方式。

JavaScript模块规范为开发者提供了不同的选择,以满足不同的项目需求和开发风格,每一种都有其独特的特点和适用场景。

在讲解CocosCreator 模块前,首先需要普及两个概念:CommonJS (CJS) 模块、ECMAScript Modules (ESM) 模块。


1、CommonJS (CJS)模块


相信熟悉Node 与 Javascript的朋友都知道, 早期的Node 与 Javascript 没有模块这个概念。


为了方便对代码开发和管理,Node 首先提出了 CommonJS 模块规范。

它采用同步加载模块的方式,通过require来引入模块,使用module.exportsexports来导出模块。


这种规范适用于服务器端开发,在浏览器中使用时可能会遇到性能问题,因为同步加载可能会阻塞页面渲染。


例如:

// tools.js 
module.exports = function dosomething(data) {
    // todo
}

// main.js
const dosomething = require('./tools.js')

CommonJs 是引入对象的一个拷贝,可以直接运行在后端环境中。因此 CommonJs 在浏览器环境中是无效的,必须要经过编译和打包后才能在浏览器环境中执行。


2、ECMAScript Modules (ESM)模块


(1)、ESM是什么?


ESM 是官方规定的JavaScript 模块规范,实现标准模块系统方案,从ES6(ES2015)开始引入,importexports 语法来导入和导出模块,与现代浏览器和Node.js 兼容。


例如:

// tools.js
export const dosomething () {
    // todo
};

// main.js
const { dosomething } = import('./tools.js')

在 script 中可以直接引用 ESM 文件:

<script src="./main.js" type="module"></script>

设置type=module ,会将加载的文件视为模块文件,识别模块的import语句并加载。


(2)、ESM 模块的特点


  • 自身的静态化特点,在编译时加载,使得页面加载速度快。

  • 真正意义上做到了按需使用。使用 import 并不会直接执行模块,而是生成一个动态的只读引用,等到真的需要用到时,才会到模块里面去读取。


二、CocosCreator 模块的规范


1、模块格式

Cocos Creator 原生支持并推荐使用 ECMAScript (ESM)模块。

Cocos Creator 引擎提供的所有功能都以 ESM 模块的形式存在。


例如:

import { _decorator, CCInteger, Component, EventMouse, input, Node,Label, Sprite} from 'cc';
const { ccclass, property,type,integer} = _decorator;

Cocos Creator 项目资源目录中以 .ts 作为后缀的文件都视为 ESM 模块。

例如:

assets/scripts/PlayerControl.ts

对于除.ts 外的其它模块格式,Cocos Creator 按以下规则来进行鉴别:

ESM 格式

  • .mjs 为后缀的文件;
  • .js 为后缀的文件,并且与其最相近的父级 package.json 文件中包含一个顶级的 "type" 字段,其值为 "module"

CommonJS 模块格式

  • .cjs 为后缀的文件;
  • .js 为后缀的文件,并且与其最相近的父级 package.json 文件中包含一个顶级的 "type" 字段,其值为 "commonjs"
  • 不在上述条件下的以 .js 为后缀的文件。

二、CocosCreator 模块说明符和模块解析


在 ESM 模块中,通过标准的导入导出语句与目标模块进行交互。

import { PlayerControl } from './PlayerControl';
export { PlayerControl } from './PlayerControl';

导入导出语句中关键字 from 后的字符串,称为 模块说明符

模块说明符也可作为参数出现在动态导入表达式 import() 中。


模块说明符用于指定目标模块,从模块说明符中解析出目标模块 URL 的过程称为 模块解析


Cocos Creator 支持三种模块说明符:


1、相对说明符


'./PlayerControl''../PlayerControl' 这样以 './''../' 开头的说明符。


相对说明符是以当前模块的 URL 为基础来解析目标模块项目路径。


例如,对于模块项目路径:

/assets/scripts/utils/PlayerControl 

如果有相对说明符:

 './a' 

这个url将解析为同目录下的 项目路径:

/assets/scripts/utils/a

2、绝对说明符

直接指定了目标模块的 URL。

例如:


/assets/scripts/utils/PlayerControl 

3、裸说明符


像 PlayerControl、PlayerControl/a 这样既不是 URL 又不是相对说明符的说明符。


Cocos Creator 使用导入映射,控制 TypeScript/JavaScript 的导入行为,指定对裸说明符的解析。


导入映射使用方法:


(1)、设置导入映射文件的路径


注意:设置导入映射文件的路径非常重要, 因为导入映射中的所有相对路径都是相对于导入映射文件路径。


通过编辑器顶部菜单栏的 项目 -> 项目设置 -> 脚本 中的 导入映射 进行设置。


在这里插入图片描述


在这里插入图片描述


设置完成后,导入映射功能开启,使用的导入映射将从指定的文件中读取。


(2)、使用别名映射

假如有一个模块在项目中被很多其他模块使用,我们希望其他模块以别名的方式引用,而不用相对路径的方式,此时就可以使用别名映射。


例如,某个模块绝对路径为 :

/assets/lib/tools.ts`

我们希望可以用别名的方式引用:

 import {} from 'tools';

操作步骤如下:

第一步,在项目目录下创建一个导入映射文件 import-map.json

// import-map.json
{
    "imports": {
        "tools": "./assets/lib/tools.ts"
    }
}

  • "imports":应用到所有模块的 顶级映射
  • "tools":要映射的模块名。
  • "./assets/lib/tools.ts": 是相对路径, 此路径将解析为绝对路径 项目目录/assets/lib/tools.ts

注意:导入映射中的所有相对路径都是相对于导入映射文件本身的位置的!


第二步,在任意模块中使用以下方式引用模块,'tools' 都将解析为模块的绝对路径。

import * as tools from 'tools';

(3)、使用目录映射

目录映射:允许映射指定目录下的所有模块。


例如,要映射项目 assets/lib/tools 目录下的所有模块,则导入映射的 json 文件如下所示:

{
    "imports": {
        "tools/": "./assets/lib/tools/"
    }
}

除了 "tools/" 指定的是我们要映射的目录,其余的与 别名映射 一致。


这样项目中的模块都能以 import {} from 'tools/...' 的形式来引用目录 tools 中的模块。

import * as a from 'tools/a';
import * as c from 'tools/b/c';

'tools/a' 将解析为模块 项目目录/assets/lib/tools/a.ts
'tools/b/c' 将解析为模块 <项目>/assets/lib/tools/b/c.ts


(4)、TypeScript 支持导入映射所需配置

在项目目录下的 tsconfig.json 文件中配置paths 字段:

// tsconfig.json
{
    "compilerOptions": {
        "paths": {
            // 注意:这里的相对路径是相对于 tsconfig.json 所在的路径
            // 由于本例中 tsconfig.json 和 import-map.json 位于同一目录,因此这里的相对路径也相似。
            "tools": ["./assets/lib/tools.ts"],
            "tools/*": ["./assets/lib/tools/*"]
        }
    }
}

三、CocosCreator引擎模块


引擎通过模块 'cc' 向开发者暴露功能接口,提供了所有引擎功能的访问,模块以 ECMAScript 模块形式存在。

模块 'cc' 的内容是动态的,可以在 CocosCreator 项目设置 中的 功能裁剪 进行启用或关闭。


在这里插入图片描述


1、引擎模块使用


Cocos Creator 3.8 引擎api 都在cc 中, 使用标准的 ES6 模块导入语法将其导入,如下导入需要使用的类:

import {
    Component,  // 导入类 Component
    _decorator, // 导入命名空间 _decorator
     CCInteger, // 导入类 CCInteger
    EventMouse,	// 导入类 EventMouse
    input,			// 导入命名空间 input
    Node,			  // 导入类 Node
    Label,			// 导入类 Node
    Sprite			// 导入类 Node
} from 'cc';


const { ccclass, property,type,integer} = _decorator;
@ccclass('PlayerControl')
export class PlayerControl extends Component 
{

}

如下整个 Cocos Creator 模块:

import * as modules from 'cc'; 
const { ccclass, property,type,integer} = _decorator;
@ccclass('PlayerControl')
export class PlayerControl extends Component 
{

}

2、引擎日志输出

import { log } from 'cc';
log('Hello world!');

3、代码优化常量

引擎模块 'cc/env' 暴露了一些构建时的 常量,这些常量代表执行环境、调试级别或平台标识。


(1)、执行环境:

BUILD是否正在构建后的环境中运行
PREVIEW是否正在预览环境中运行
EDITOR是否正在编辑器环境中运行

(2)、调试级别:

名称(类型都为 boolean说明
DEBUG是否处于调试模式。仅当构建时未勾选调试选项的情况下为 false,其它情况下都为 true
DEV等价于 DEBUG/EDITOR/PREVIEW

调试级别使用如:

import { log } from 'cc';
import { DEV } from 'cc/env';

if (DEV) {
    log('I am in development mode!');
}

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

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

相关文章

PixelSNAIL论文代码学习(3)——自注意力机制的实现

文章目录 引言正文介绍自注意力机制的简单实现样例本文中的自注意力机制具体实现代码分析nn.nin函数的具体实现nn.causal_attention模块实现注意力模块实现代码完整实现代码使用pytorch实现因果注意力模块causal_atttention模块 问题 总结引用 引言 阅读了pixelSNAIL,很简短&a…

java八股文面试[多线程]——线程的状态

5种状态一般是针对传统的线程状态来说&#xff08;操作系统层面&#xff09; 6种状态&#xff1a;Java中给线程准备的 NEW&#xff1a;Thread对象被创建出来了&#xff0c;但是还没有执行start方法。 RUNNABLE&#xff1a;Thread对象调用了start方法&#xff0c;就为RUNNABLE状…

已解决“SyntaxError: invalid character in identifier“报错问题

本文摘要&#xff1a;本文已解决 Python FileNotFoundError 的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领…

Oracle数据库分页查询

方法一 方法二 方法一要比方法二效率要高很多&#xff0c;查询效率提高主要体现在WHERE ROWNUM < 40这个语句上。 这是由于CBO优化模式下&#xff0c;Oracle可以将外层的查询条件推到内层查询中&#xff0c;以提高内层查询的执行效率。方法一中&#xff0c;第二层的查询条件…

完善开发工具箱:免费开源社区版软件推荐

一、背景 工欲善其事必先利其器&#xff0c;在日常的IT工作中&#xff0c;好的工具软件是开发者日常工作中最重要的工具之一。然而&#xff0c;专业版的软件价格昂贵&#xff0c;对于小团队或个人开发者来说可能是一大负担。当然国内大家会普遍推荐使用破解版&#xff0c;小公…

Java【手撕滑动窗口】LeetCode 438. “字符串中所有异位词“, 图文详解思路分析 + 代码

文章目录 前言一、字符串中所有异位词1, 题目2, 思路分析2.1, 引入哈希表找出异位词2.2, 引入变量记录"有效字符的个数"2.3, left 右移维护窗口2.4, 总结核心步骤 3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; Ja…

bazel工程介绍和demo构建

参考官方示例项目&#xff1a;git clone https://github.com/bazelbuild/examples 项目结构 使用Bazel管理的项目一般包含以下几种Bazel相关的文件&#xff1a;WORKSPACE(同WORKSPACE.bazel)&#xff0c;BUILD(同BUILD.bazel)&#xff0c;.bzl 和 .bazelrc 等。 具体结构如下…

【洛谷】P3853 路标设置

原题链接&#xff1a;https://www.luogu.com.cn/problem/P3853 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 整体思路&#xff1a;二分答案 由题意知&#xff0c;公路上相邻路标的最大距离定义为该公路的“空旷指数”。在公路上增设一些路标&…

6. series对象及DataFrame对象知识总结

【目录】 文章目录 6. series对象及DataFrame对象知识总结1. 导入pandas库2. pd.Series创建Series对象2.1 data 列表2.2 data 字典 3. s1.index获取索引4. s1.value获取值5. pd.DataFrame()-创建DataFrame 对象5.1 data 列表5.2 data 嵌套列表5.3 data 字典 6. df[列索引]…

Linux安装MySQL5.7.26教程图解

0、准备工作 下载MySQL软件包 ①、官网下载&#xff1a;https://www.cnblogs.com/linu-x/p/15701479.html#_label6 ②、百度网盘下载&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;chao ③、文件说明 主机名 CentOS版本 MySQL版本 IP地址 test CentOS Linux …

AtCoder Beginner Contest 318

目录 A - Full Moon B - Overlapping sheets C - Blue Spring D - General Weighted Max Matching E - Sandwiches F - Octopus A - Full Moon #include<bits/stdc.h> using namespace std; const int N1e65; typedef long long ll ; const int maxv4e65; typedef …

nsq中diskqueue详解 - 第二篇

上一篇博客 nsq中diskqueue详解 - 第一篇_YZF_Kevin的博客-CSDN博客 中我们讲了diskqueue是什么&#xff0c;为什么需要它&#xff0c;它的整体架构流程&#xff0c;以及对外接口等等&#xff0c;如果你还没了解过&#xff0c;强烈建议先看一下&#xff0c;不然直接看这篇博客的…

AVR128单片机 USART通信控制发光二极管显示

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void port_init(void) { PORTA 0xFF; DDRA 0x00;//输入 PORTB 0xFF;//低电平 DDRB 0x00;//输入 PORTC 0xFF;//低电平 DDRC 0xFF;//输出 PORTE 0xFF; DDRE 0xfE;//输出 PO…

Leetcode Top 100 Liked Questions(序号236~347)

236. Lowest Common Ancestor of a Binary Tree 题意&#xff1a;二叉树&#xff0c;求最近公共祖先&#xff0c;All Node.val are unique. 我的思路 首先把每个节点的深度得到&#xff0c;之后不停向上&#xff0c;直到val相同&#xff0c;存深度就用map存吧 但是它没有向…

Lesson4-2:OpenCV图像特征提取与描述---Harris和Shi-Tomas算法

学习目标 理解Harris和Shi-Tomasi算法的原理能够利用Harris和Shi-Tomasi进行角点检测 1 Harris角点检测 1.1 原理 H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像&#xff0c;角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化&#xff…

【多线程】线程间通信及状态

文章目录 1. 线程间的通信1.1 wait和notify1.2 notify随机唤醒1.3 notifyAll()1.4 join() 2. 线程间的状态3. 验证线程的状态3.1 验证NEW、RUNNABLE、TERMINATED3.2 验证WAITING3.3 验证TIMED-WAITING3.4 验证BLOCKED 4. 面试题&#xff1a;wait和sleep对比 1. 线程间的通信 1…

人工智能轨道交通行业周刊-第58期(2023.8.28-9.3)

本期关键词&#xff1a;成都智慧工厂、机务段、站台地标、备案大模型、AIGC报告 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路…

Redis 缓存穿透击穿和雪崩

一、说明 Redis 缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要害的问题&#xff0c;就是数据的一致性问题&#xff0c;从严格意义上讲&#xff0c;这个问题无解。如果对…

C# Color颜色RGB对照表

序号Color色系颜色RGB图例1Color.AliceBlue蓝色艾丽丝蓝240,248,2552Color.AntiqueWhite白色古典白色250,235,2153Color.Aqua&#xff0c;Color.Cyan青色浅蓝色&#xff0c;蓝绿色&#xff0c;青色0,255,255 C# Color颜色RGB对照表_旭东怪的博客-CSDN博客 C#颜色和名称样式对照…

Nginx全家桶配置详解

源码包安装NGINX A&#xff0c;搭建Web Server&#xff0c;任意HTML页面&#xff0c;其8080端口提供Web访问服务&#xff0c;截图成功访问http(s)&#xff1a;//[Server1]:8080并且回显Web页面。保留Server1&#xff0c;但是不允许直接访问Server 1&#xff0c;再部署1套NGINX …