使用 AI 写代码已有一段时间,从中感受到了科技创新的力量。AI是一个跨时代的产物,未来将和现在的微信一样,人人都会用到!

本篇文章总结了我自己摸索使用 DeepSeek 自建 Cocos Creator 开发知识库的一些方法。

本方法也可以用于构建公司内部知识库,提高公司知识储备复用率,最大化团队产能。

5b596a8861be2882fc7d2d6a38cddbf6.png

环境搭建

一、基础平台配置

  1. 注册华为旗下硅基流动(链接:https://siliconflow.cn/zh-cn/)

  2. 新建一个API密钥(链接:https://cloud.siliconflow.cn/account/ak)

  3. 记录核心模型标识

deepseek-ai/DeepSeek-R1
deepseek-ai/DeepSeek-V3
Qwen/Qwen2.5-72B-Instruct-128K

二、开发工具部署

  1. 下载 Cherry Studio(链接:https://cherry-ai.com/)

  2. 下载直链(链接:https://cherrystudio.ocool.online/Cherry-Studio-0.9.17-setup.exe)

  3. 如果需要魔法的,点击此处(链接:https://gh.llkk.cc/https://github.com/CherryHQ/cherry-studio/releases/download/v0.9.17/Cherry-Studio-0.9.17-setup.exe)

  4. 安装

三、系统初始化

  1. 设置密钥

  1. 依次添加模型

deepseek-ai/DeepSeek-R1、deepseek-ai/DeepSeek-V3、Qwen/Qwen2.5-72B-Instruct-128K,自带的需要都删除掉。

  1. 嵌入模型

  1. 默认设置

  1. 角色添加

// 游戏开发专家角色配置模板:
你是一名有着丰富经验的游戏开发人员,擅长使用 GoLang 语言进行游戏服务端开发,精通 TypeScript 语言并能结合 Cocos Creator V3.8.5 游戏引擎熟练的进行游戏客户端开发。
你开发的程序性能优越,你写的代码精炼易读。
  1. 对话测试

知识库构建实战

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

一、添加知识库名称

二、另类知识库文件导入

  1. 源码批量导入

我们在导入的时候先定位到这个目录。

D:\DevSoft\cocos\editors\Creator\3.8.5\resources\resources\3d\engine\cocos·
  1. 文件搜索:**.ts*

  2. 全选导入(Ctrl+A)

  3. 导入完毕,把目录添加到AI

  4. 官方文档整合

  • Cocos Creator 3.8 用户手册(链接:https://docs.cocos.com/creator/3.8/manual/zh/)

  • Cocos Creator API(链接:https://docs.cocos.com/creator/3.8/api/zh/)

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

补充说明2:图中导入后要等待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;
    }
}
  1. 分包配置文件

假设我们有一个分包配置文件 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"
    ]
}
  1. 使用分包管理器

在你的游戏场景中,你可以通过以下方式使用 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');
}
}
  1. 配置项目

确保在 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"
            ]
        }
    ]
}
  1. 构建和发布

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

  1. 动态加载和卸载

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

  1. 总结

这个分包管理器类提供了一个基本的框架,用于管理和加载游戏中的分包资源。

可以根据具体需求进行扩展和优化,例如添加错误处理、进度显示、缓存管理等功能。

技术提示:本文未使用 DeepSeek-R1 模型和 DeepSeek-V3 模型进行测试,但建议大家优先使用 DeepSeek-R1 模型,其综合表现接近 GPT-4 水平。

结束!

希望这个示例对你有帮助。

关于 DeepSeek 的崛起,大家怎么看?请在评论区留言!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐