【疯狂撕扯 AI 面纱】之自建ccc知识库【下】

接上篇:【疯狂撕扯 AI 面纱】之自建ccc知识库【上】

下面我们来个最简单粗暴的知识库文件导入,看图:

一、添加知识库名称

二、另类知识库文件导入
1、比如我的ccc引擎包路径为:
D:\DevSoft\cocos\editors\Creator\3.8.5\resources\resources\3d\engine\cocos

2、然后我们在导入的时候先定位到这个目录

3、然后使用搜索:【*.ts】,再Ctrl+A 把这些源码文件都给弄进去,哈哈

4、导入完毕,然后把目录也添加到AI

5、接着把ccc的api网址给加进去:
Cocos Creator 3.8 用户手册 | Cocos Creator
Cocos Creator API

> 补充说明:
> 一定要如图3点地方选择全部(*) 文件,不然ts文件不会显示、搜索也搜索不到!
> 一定要如图3点地方选择全部(*) 文件,不然ts文件不会显示、搜索也搜索不到!
> 一定要如图3点地方选择全部(*) 文件,不然ts文件不会显示、搜索也搜索不到!

图中导入后要等待AI分析,蓝色小圆圈代表还在学习中,绿色的勾√代表是学习好的!
等待全部学习完毕,就可以使用AI进行提问了,我们先测试下一啊!!

1. 分包管理器类

首先,我们创建一个分包管理器类,用于处理分包的加载和更新。

import { _decorator, Component, resources, AssetManager, Asset, error, log, director, SceneAsset, progressives } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('PackageManager')
export class PackageManager extends Component {
    @property({ tooltip: '分包配置文件路径', type: [String] })
    packageConfigPaths: string[] = [];

    private _packageConfig: { [name: string]: string[] } = {};
    private _loadedPackages: Set<string> = new Set();

    start() {
        this.loadPackageConfig();
    }

    private async loadPackageConfig() {
        for (const path of this.packageConfigPaths) {
            try {
                const config = await resources.loadAsync<Asset>(path, Asset);
                const json = JSON.parse(config.text);
                for (const packageName in json) {
                    this._packageConfig[packageName] = json[packageName];
                }
            } catch (err) {
                error(`Failed to load package config from ${path}: ${err}`);
            }
        }
        log('Package config loaded:', this._packageConfig);
    }

    public async loadPackage(packageName: string) {
        if (this._loadedPackages.has(packageName)) {
            log(`Package ${packageName} is already loaded.`);
            return;
        }

        const packageAssets = this._packageConfig[packageName];
        if (!packageAssets) {
            error(`Package ${packageName} not found in package config.`);
            return;
        }

        try {
            await AssetManager.instance.loadBundle(packageName, (err, bundle) => {
                if (err) {
                    error(`Failed to load bundle for package ${packageName}: ${err}`);
                } else {
                    log(`Bundle for package ${packageName} loaded successfully.`);
                }
            });

            for (const assetPath of packageAssets) {
                await resources.loadAsync(assetPath);
                log(`Asset ${assetPath} loaded successfully.`);
            }

            this._loadedPackages.add(packageName);
            log(`Package ${packageName} loaded successfully.`);
        } catch (err) {
            error(`Failed to load package ${packageName}: ${err}`);
        }
    }

    public async unloadPackage(packageName: string) {
        if (!this._loadedPackages.has(packageName)) {
            log(`Package ${packageName} is not loaded.`);
            return;
        }

        const packageAssets = this._packageConfig[packageName];
        if (!packageAssets) {
            error(`Package ${packageName} not found in package config.`);
            return;
        }

        for (const assetPath of packageAssets) {
            resources.release(assetPath);
            log(`Asset ${assetPath} released successfully.`);
        }

        AssetManager.instance.releaseBundle(packageName);
        this._loadedPackages.delete(packageName);
        log(`Package ${packageName} unloaded successfully.`);
    }

    public async loadScene(sceneName: string) {
        const packageName = this.getPackageForScene(sceneName);
        if (packageName) {
            await this.loadPackage(packageName);
        }

        try {
            await director.loadSceneAsync(sceneName);
            log(`Scene ${sceneName} loaded successfully.`);
        } catch (err) {
            error(`Failed to load scene ${sceneName}: ${err}`);
        }
    }

    private getPackageForScene(sceneName: string): string | null {
        for (const packageName in this._packageConfig) {
            const packageAssets = this._packageConfig[packageName];
            if (packageAssets.includes(sceneName)) {
                return packageName;
            }
        }
        return null;
    }
}

2. 分包配置文件

假设我们有一个分包配置文件 packageConfig.json ,内容如下:

{
    "main": [
        "prefabs/player",
        "prefabs/enemy",
        "scenes/main"
    ],
    "level1": [
        "prefabs/level1/obstacle",
        "prefabs/level1/boss",
        "scenes/level1"
    ],
    "level2": [
        "prefabs/level2/obstacle",
        "prefabs/level2/boss",
        "scenes/level2"
    ]
}

3. 使用分包管理器

在你的游戏场景中,你可以通过以下方式使用 PackageManager

import { _decorator, Component, director } from ‘cc’;
const { ccclass, property } = _decorator;

@ccclass(‘GameController’)
export class GameController extends Component {
@property({ type: PackageManager })
packageManager: PackageManager = null;

start() {
    this.packageManager.loadPackage('main');
}

public async loadLevel1() {
    await this.packageManager.loadScene('level1');
}

public async unloadLevel1() {
    await this.packageManager.unloadPackage('level1');
}

}

4. 配置项目

确保在 Cocos Creator 项目中正确配置分包。你可以在 build.json 中指定分包:

{
    "packages": [
        {
            "name": "main",
            "include": [
                "prefabs/player",
                "prefabs/enemy",
                "scenes/main"
            ]
        },
        {
            "name": "level1",
            "include": [
                "prefabs/level1/obstacle",
                "prefabs/level1/boss",
                "scenes/level1"
            ]
        },
        {
            "name": "level2",
            "include": [
                "prefabs/level2/obstacle",
                "prefabs/level2/boss",
                "scenes/level2"
            ]
        }
    ]
}

5. 构建和发布

在 Cocos Creator 中,使用 Build 功能构建项目,并确保分包配置正确应用。构建完成后,你可以将资源发布到你的服务器或本地文件系统。

6. 动态加载和卸载

通过 GameController 中的 loadLevel1unloadLevel1 方法,你可以在游戏运行时动态加载和卸载分包。

总结

这个分包管理器类提供了一个基本的框架,用于管理和加载游戏中的分包资源。你可以根据具体需求进行扩展和优化,例如添加错误处理、进度显示、缓存管理等功能。希望这个示例对你有帮助!如果有任何问题或需要进一步的功能扩展,请随时告诉我。

总体来说多磨合一下,就很OK了!

另外没有使用R1和V3测试,R1效果肯定是最好的!堪比gtp4o1

7赞

这个官方弄个Ai喂养一下再提供给开发者用就舒服了:unamused:

Cocos 小秘书最初就是这么设定的

4赞

回来吧jare,继续弄小秘书 :rofl:

回来吧jare,继续弄cocos :rofl:

牛逼啊 一会儿我就去试试

回来吧jare,继续弄cocos :rofl:

一直学习不动了

机器已经学傻了 不动

也可以使用阿里的百炼,里面也可以创建应用和知识库,不过也是收费的。不过里面有有很多模型集合

回来吧jare,继续弄小秘书 :rofl:

1赞

只需要把 cc.d.ts 给它就可以了。 cc.d.ts 等于是 API文档+API接口

1赞

是啊,这个确实方便

你把他缩小去玩一把大乱斗,回来就差不多了

按麒麟子说的其实丢一个 cc.d.ts 也可以

会不会突然给我弹个广告出来,恶心我一下

这叫荆棘之甲,伤害反弹~!

我就知道你把卸载的英雄联盟又安装上了

举一个例子,就这个写得稀烂的vec api,直接乱写出Bug

该把邀请码 发出来 这样大家都有2000万Tokens了 邀请码:ae9pUaOw

嘿嘿嘿嘿 :crazy_face:嘿~