本帖最后由 空伊伊 于 2023-11-8 17:37 编辑
一、新建一个脚本
创建一个脚本的步骤如下:

双击打开脚本后,脚本内容如下:
@Component
export default class MyScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
}
/**
* 周期函数 每帧执行
* 此函数执行需要将this.useUpdate赋值为true
* @param dt 当前帧与上一帧的延迟 / 秒
*/
protected onUpdate(dt: number): void {
}
/** 脚本被销毁时最后一帧执行完调用此函数 */
protected onDestroy(): void {
}
}
可以看到,当我们点击“新建脚本”后,编辑器会为我们自动生成一个文件,文件里默认有一个 class 继承于 Script,这个文件就被称之为“脚本”
(实质上,脚本是继承 Script 的一个class)
脚本的特点:
当被创建出来的时候,会执行自己的生命周期函数,并且获取自己所挂载对象的信息
如何创建脚本?(下面会讲)
二、使用脚本
1.拖到对象管理器中使用
@Component
export default class MyScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
console.log("@@@我执行啦~")
}
}

运行游戏就能看到运行结果:

2.用代码创建脚本
编写 MyScript1 脚本,等待被创建
@Component
export default class MyScript1 extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
console.log("@@@我是脚本1")
}
}
2.1 用类名创建脚本(Script.spawnScript)
import MyScript1 from "./MyScript1"
@Component
export default class GameStart extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected async onStart(): Promise<void> {
console.log("@@@GameStart 执行啦~")
// 在服务端执行spawnScript,第二个参数默认是true,会在客户端同步创建脚本
let myScript1 = await Script.spawnScript(MyScript1, false)
}
}
执行结果:

注意事项:
如果一个脚本文件里写了两个继承Core.Script的类,那么只会执行默认导出(export default)的那个class。
在下方脚本中,我新增了一个MyScript2,并将 default 添加到 MyScript2

执行结果:

2.2 用类名创建脚本,并挂载到物体上
首先在 MyScript2 中添加打印挂载物体名字的代码
export default class MyScript2 extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
console.log("@@@我是脚本2")
console.log("@@@我挂载的物体:" + this.gameObject.name)
}
}
然后在 GameStart 中添加创建 MyScript2 并挂载到物体上的代码
@Component
export default class GameStart extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected async onStart(): Promise<void> {
console.log("@@@GameStart 执行啦~")
// 创建一个方块
let cube = await GameObject.asyncSpawn("7669")
// 修改Cube的名字
cube.name = "小方块"
// 创建MyScript1脚本,并挂载到cube上
Script.spawnScript(MyScript2, false, cube)
}
}
执行结果:

2.3 删除脚本
删除脚本可以使用脚本的成员方法:destroy()
将脚本彻底删干净,这里分两步操作
- 第一步:在脚本生命周期函数的 onDestory 里,清除所有的引用关系
- 第二步:让这个脚本=null