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


在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, // 导入命名空间 _decoratorCCInteger, // 导入类 CCIntegerEventMouse,	// 导入类 EventMouseinput,			// 导入命名空间 inputNode,			  // 导入类 NodeLabel,			// 导入类 NodeSprite			// 导入类 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.mzph.cn/news/65282.shtml

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

相关文章

vulnhub Seattle-0.0.3

环境&#xff1a;vuluhub Seattle-0.0.3 1.catelogue处任意文件下载(目录穿越) http://192.168.85.139/download.php?item../../../../../../etc/passwd 有个admin目录&#xff0c;可以下载里面的文件进行读取 2.cltohes详情页面处(参数prod)存在sql报错注入 http://192.16…

【C++刷题】动态规划

文章目录 前言一、斐波那契系列1.第 N 个泰波那契数2.三步问题3.使用最小花费爬楼梯4.解码方法5.不同路径6.下降路径最小和7.地下城游戏 二、多种状态系列1.按摩师2.打家劫舍II3.删除并获得点数4.粉刷房子5.买卖股票的最佳时机6.买卖股票的最佳时机III 三、子数组和子串系列1.最…

【iOS】Masonry的基本使用

文章目录 前言一、使用Masonry的原因二、约束的常识三、Masonry的简单使用四、Masonry的用例总结 前言 暑假安装了cocoapods&#xff0c;简单使用其调用了SVGKit&#xff0c;但是没有学习Masonry&#xff0c;特此总结博客记录Masonry的学习 一、使用Masonry的原因 Masonry是一…

最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库

一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Mi…

详解 SpringMVC 的 @RequestMapping 注解

文章目录 1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性5、RequestMapping注解的params属性&#xff08;了解&#xff09;6、RequestMapping注解的headers属性&#xff08;了解&#xff09;7、Sp…

6. vue-element-admin 二次开发避坑指南

vue-element-admin 二次开发避坑指南 1.1 前言1.1.1 切换标签时未保存页面的操作内容1.1.2 markdown 样式乱码1.1.3 修改默认尺寸1.1.4 当后端服务器宕机情况下页面加载层一直转圈无法停止&#xff0c;只能关闭页面1.1.5 隐藏齿轮 1.1 前言 上一篇博文&#xff0c;我们分享了vu…

从零构建深度学习推理框架-11 Resnet

op和layer结构 在runtime_ir.cpp中&#xff0c;我们上一节只构建了input和output&#xff0c;对于中间layer的具体实现一直没有完成&#xff1a; for (const auto& kOperator : this->operators_) {if (kOperator->type "pnnx.Input") {this->input_o…

ssm+vue“魅力”繁峙宣传网站源码和论文

ssmvue“魅力”繁峙宣传网站源码和论文102 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身…

C语言:截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章&#xff1a; 《C语言&#xff1a;整型提升》 《C语言&#xff1a;算数转换》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求…

使用安全复制命令scp在Windows系统和Linux系统之间相互传输文件

现在已经有很多远程控制服务器的第三方软件平台&#xff0c;比如FinalShell&#xff0c;MobaXterm等&#xff0c;半可视化界面&#xff0c;使用起来非常方便和友好&#xff0c;两个系统之间传输文件直接拖就行&#xff0c;当然也可以使用命令方式在两个系统之间相互传递。 目录…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别&#xff0c;epoll为什么高效&#xff1f; 54 说说多路IO复用技术有哪些&#xff0c;区别是什么&#xff1f; 55 简述socket中select&#xff0c;epoll的使用场景和区别&#xff0c;epoll水平触发与边缘触发的区别&#xff1f;…

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代&#xff0c;快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎&#xff0c;为我们提供了一种优秀的解决方案。除了传统的文本搜索&#xff0c;El…

【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管动态显示(五)

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL22G开发平台&#xff08;盘古22K&#xff09; 一&#xff1a;盘古22K开发板&#xff08;紫光同创PGL22G开发…

http和https的区别?

什么是 HTTP&#xff1f; HTTP是一种互联网数据传输协议&#xff0c;用于在网络服务器和客户端之间进行数据传输。作为万维网的基础&#xff0c;HTTP协议允许网络浏览器向网络服务器发送请求&#xff0c;服务器则会返回响应。HTTP协议基于文本&#xff0c;因此传输的数据是人类…

41.岛屿数量(第四期模拟笔试)(BFS练习题)

题目&#xff1a; 给定一个 m 行 n 列的二维地图&#xff0c;初始化每个单元格都是海洋&#xff0c;二维地图外也全是海洋。 操作 addLand 会将单元格&#xff08;col, row&#xff09;变为陆地。 定义一系列相连的被海洋包围的陆地为岛屿&#xff0c; 横向相邻或者纵向相连的…

微信小程序请求接口返回的二维码(图片),本地工具和真机测试都能显示,上线之后不显示问题

请求后端接口返回的图片&#xff1a; 页面展示&#xff1a; 代码实现&#xff1a; :show-menu-by-longpress"true" 是长按保存图片 base64Code 是转为base64的地址 <image class"code" :src"base64Code" alt"" :show-menu-by-long…

Three.js实现模型,模型材质可拖拽效果 DragControls

Three.js提供了一个拖拽的API DragControls 用于实现模型材质拖拽效果 DragControls&#xff1a;是一个用于在Three.js中实现拖拽控制的辅助类。它简化了在Three.js中实现拖拽物体的过程。 DragControls的构造函数接受三个参数&#xff1a; objects&#xff1a;一个包含需要…

C# textBox 右键菜单 contextMenuStrip

需求&#xff1a; 想在上图空白处可以右键弹出菜单&#xff0c;该怎么做呢&#xff1f; 1.首先&#xff0c;拖出一个 ContextMenuStrip。 随便放哪里都行&#xff0c;如下: 2.在textBox里关联这个“右键控件”即可&#xff0c;如下&#xff1a; 最终效果如下&#xff1a; 以上…

自定义类型:结构体、枚举、联合

目录 结构体 结构体的基础知识 结构的声明 特殊的声明 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐 修改默认对齐数 结构体传参 位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体&#xff08;共…

编写中间件以用于 Express 应用程序

概述 中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。 中间件函数可以执行以下任务&#xff1a; 执行任何代码。对请求和响应对象进行更改。结束请求/响应循环。调用堆…