[开发者心得] 【脚本的使用】口袋方舟编辑器中“脚本”的含义

[复制链接]
1792 |1
空伊伊 发表于 2023-2-28 15:42:32 | 显示全部楼层 |阅读模式

本帖最后由 空伊伊 于 2023-11-8 17:37 编辑

一、新建一个脚本

创建一个脚本的步骤如下:

image-20231010152050448

双击打开脚本后,脚本内容如下:


@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.拖到对象管理器中
  • 2.用代码创建

二、使用脚本

1.拖到对象管理器中使用

@Component
export default class MyScript extends Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        console.log("@@@我执行啦~")
    }
}

image-20231010152358825

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

image-20231010152445672

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)
    }
}

执行结果:

image-20231010153314243

注意事项:

如果一个脚本文件里写了两个继承Core.Script的类,那么只会执行默认导出(export default)的那个class。

在下方脚本中,我新增了一个MyScript2,并将 default 添加到 MyScript2

image-20231010153454535

执行结果:

image-20231010153514378

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)
    }
}

执行结果:

image-20231010154208457

2.3 删除脚本

删除脚本可以使用脚本的成员方法:destroy()

将脚本彻底删干净,这里分两步操作

  • 第一步:在脚本生命周期函数的 onDestory 里,清除所有的引用关系
  • 第二步:让这个脚本=null
回复

使用道具 举报

Othanse 发表于 2023-2-28 17:30:43 | 显示全部楼层
牛啊牛啊
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表