【3.8.X】求组如何让一个脚本在游戏启动时自动加载

我现在在制作缓存脚本,这个脚本会在几个场景中都通用,所以我想让它在游戏启动的时候自动挂载,并且自动执行初始化函数,各位大佬有方案吗?

你直接挂在场景的节点上不就行了? :thinking:

在director监听事件回调里处理逻辑 如果需要在多个场景中通用 就搞个常驻节点

你在类外面直接new一个class执行就行

能详细说说吗 常驻节点是?我是最近才学习cocos

主要是这个脚本是在多场景中使用的 挂载在节点上的话 切换场景不就是没用了?

类外我要怎么new呢? 目前还是有点不太理解机制 才学习没多久

你是初始化界面数据还是游戏数据,游戏数据的话,写个单例就行了

主要是游戏数据,单例模式的话我看了也加了,感觉还有点没看懂逻辑,所以来论坛问问

请我喝奶茶,我给你教得会会的 :crazy_face:

只要能搞明白 一杯奶茶妥妥的

游戏数据就没必要挂在脚本,单例模式在合适的时机调用对应的方法就行,多个场景切换,在切换时掉用对应的方法处理数据就行。(可以先看下单例的列子,很好理解)

有详细的模板或例子吗 我研究下?
谢谢

单例模式最简单的写法 论坛,网页随笔搜一下,js 的单例,一大堆,可以看看

// 导入引擎模块和环境判断变量
import { Director, director } from "cc";
import { EDITOR, EDITOR_NOT_IN_PREVIEW } from "cc/env";

// 导入各个功能模块(模块命名经过混淆处理)
import { _oiduA } from "./Audio";         // 音频管理模块
import { _N01L } from "./L10N";           // 多语言模块(L10N = Localization)
import { _KDS } from "./SDK";             // 第三方SDK管理模块
import { _emiT } from "./Time";           // 时间管理模块

/**
 * 示例核心管理类(单例模式)
 * 用于集中管理各个功能模块的实例,并提供全局访问点
 */
class Example {
    // 单例实例引用
    private static _instance: Example;

    /**
     * 获取单例实例
     * @returns 全局唯一的Example实例
     */
    public static get instance(): Example {
        if (!this._instance) {
            this._instance = new Example();
        }
        return this._instance;
    }

    // 公有属性:各个功能模块的实例引用
    public audio: _oiduA = undefined!;    // 音频模块实例(延迟初始化)
    public l10n: _N01L = _N01L.instance;  // 多语言模块实例(立即初始化)
    public sdk: _KDS = undefined!;        // SDK模块实例(延迟初始化)
    public time: _emiT = _emiT.instance;  // 时间模块实例(立即初始化)

    /**
     * 私有构造函数(单例模式)
     * 注意:在编辑器环境且非预览模式时不会初始化功能模块
     */
    private constructor() {
        // 编辑器环境判断:在编辑器且非预览模式时直接返回
        if (EDITOR && EDITOR_NOT_IN_PREVIEW) {
            return;
        }

        // 监听场景加载完成事件(确保场景就绪后初始化需要场景上下文的模块)
        director.on(Director.EVENT_AFTER_SCENE_LAUNCH, () => {
            // 延迟初始化音频模块
            if (this.audio === undefined) {
                this.audio = _oiduA.instance;
            }

            // 延迟初始化SDK模块
            if (this.sdk === undefined) {
                this.sdk = _KDS.instance;
            }
        }, this);
    }
}

/**
 * 全局类型声明扩展
 * 将模块实例挂载到全局命名空间,方便全局访问
 */
declare global {
    namespace globalThis {
        namespace example {
            const audio: _oiduA;  // 全局音频模块访问点
            const l10n: _N01L;     // 全局多语言模块访问点
            const sdk: _KDS;       // 全局SDK模块访问点
            const time: _emiT;     // 全局时间模块访问点
        }
    }
}

// 将单例实例挂载到全局对象
globalThis.example = Example.instance;

// 空导出(此文件作为模块执行,确保单例初始化)
export { }
1赞

实例数据类,直接单例模式。
静态数据类,直接导出引用。

感谢 我研究一下

好的 谢谢 我研究研究

好的明白了 我再研究研究

老哥 你这里挂载到全局对象 我有些不理解 你能详细说说吗?

我搞了一下,整篇代码不是自动运行并初始化的,不知道是不是这里的问题 我要怎么挂载呢,如果我要那种游戏一启动,无论在那个场景中,就自动运行的该怎么搞呢