【Cocos Creator UI资源管理】

NGUI UI资源管理工具 写在前面:    项目开发迭代过程中,UI资源的换版,会造成很多旧资源的冗余,而人工删除资源麻烦在于无法区分这个资源是不是还有地方再用,此工具的目的是提供一个可视化的界面,根据资源名称确定其所在图集,并且列出预制体对于改资源的引用,同时显示图片的大小,预览,路径等信息。为UI资源的梳理提供便利。布局如下:代码如下:/* 图集资源管理器 1:查询UI资源 2:图集查重 3:资源引用处理 4:... 阅读详情

上一篇内容:Cocos Creator 使用AssetBundle管理资源

UI框架设计思路

  • 每个UI对应一个控制代码,一个UI视图只有一个UIController代码。
  • UI视图名字:name
  • UI视图对应代码名字:name_controller
  • 所有UI视图控制代码都放在UIController文件夹下。
  • 为每个UI视图生成一个标准的代码模板(可以扩展编辑器或者使用脚本实现)
  • 新建UIManager脚本,负责显示UI,管理UI,删除UI,在显示UI的同时挂上UIController脚本。

搭建UI框架操作:

一、新项目为例,首先搭建AssetBundle资源管理框架

1、创建项目目录结构:

Charactors、Effects、GUI、Maps、Sounds文件夹为AssetBundle
项目目录结构

2、创建启动脚本

在Scripts文件夹下创建GameLaunch脚本文件
在这里插入图片描述
GameLaunch脚本内容如下:

import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('GameLaunch')
export class GameLaunch extends Component {
    private static Instance: GameLaunch = null;

    protected onLoad(): void {
        if(GameLaunch.Instance === null){
            GameLaunch.Instance = this;
        }else{
            this.destroy();
            return;
        }
        //初始化游戏框架:资源管理,声音管理,UI管理,网络管理,日志管理//...      

    }
    start() :void{
        //检测资源更新
    }
}

3、创建游戏脚本

在Game文件夹下创建Game脚本:
在这里插入图片描述
Game脚本内容如下:

import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

export class Game extends Component {
    public static Instance: Game = null;

    protected onLoad(): void {
        if(Game.Instance === null){
            Game.Instance = this;
        }else{
            this.destroy();
            return;
        }
    }

    public StartGame():void{
        //预加载资源
    }

    public EnterGameScene():void{
        //释放游戏场景,UI,角色等
    }
}

4、创建AssetBundle管理脚本

在Managers文件夹下创建ResMgr脚本
在这里插入图片描述
脚本内容和上一章Cocos Creator 使用AssetBundle管理资源的一样:

import { _decorator, assetManager, Component, error, Node } from 'cc';

export default class ResMgr extends Component {
    //单例
    public static Instance: ResMgr = null;

    //资源总数  
    private total:number = 0;
    //当前加载资源数
    private now:number = 0;

    //ab包总数
    private totalAb:number = 0;
    //当前加载ab包数
    private nowAb:number = 0;

    //进程函数
    private progressFunc:Function = null;
    //完成回调函数
    private endFunc:Function = null;
    //ab包
    private abBunds= {};

    /**
     * 单例初始化
     * @returns 
     */
    protected onLoad(): void {
        if(ResMgr.Instance === null){
            ResMgr.Instance = this;
        }else{
            this.destroy();
            return;
        }
    }

    /**
     * 加载资源包中的资源
     * @param resPkg 资源包
     */
    private loadAssetsInAssetsBundle(resPkg):void{
        for(var key in resPkg){
            var urlSet = resPkg[key].urls;
            var typeClass = resPkg[key].assetType;

            for(var i = 0;i<urlSet.length;i++){
                this.loadRes(this.abBunds[key],urlSet[i],typeClass);
            }
        }
    }
    /**
     * 加载单个资源
     * @param abBundle 资源包
     * @param url 资源路径
     * @param typeClass 资源类型
     */
    private loadRes(abBundle,url,typeClass):void{
        abBundle.load(url,typeClass,(error,asset)=>{
            this.now++;
            if(error){
                console.log("load Res"+ url+" error:"+error);
            }
            else{
                console.log("load Res"+ url+" success");
            }
            if(this.progressFunc){
                this.progressFunc(this.now,this.total);
            }
            console.log(this.now,this.total);
            if(this.now >= this.total){
                if(this.endFunc!=null){
                    this.endFunc();
                }
            }
        })
    }

    /**
     * 加载AssetBundle资源包
     * @param abName 资源包名
     * @param endFunc 回调函数
     */
    private loadAssetsBundle(abName:string,endFunc:Function):void{
        assetManager.loadBundle(abName,(err,bundle)=>{
            if(err!=null){
                this.abBunds[abName] = null;
            }
            else{
                this.abBunds[abName] = bundle;
            }
            if(endFunc){
                endFunc();
            }
        });
        
    }

    /**
     * 预加载资源包
     * @param resPkg 资源包
     * @param progressFunc 进程函数
     * @param endFunc 回调函数
     */
    preloadResPkg(resPkg, progressFunc ,endFunc):void{
        this.total = 0;
        this.now = 0;

        this.totalAb = 0;
        this.nowAb = 0;

        this.progressFunc = progressFunc;
        this.endFunc = endFunc;

        for(var key in resPkg){
            this.totalAb++;//ab包总数
            this.total += resPkg[key].urls.length;//资源总数
        }

        for(var key in resPkg){
            this.loadAssetsBundle(key,()=>{
                this.nowAb++;
                if(this.nowAb === this.totalAb){
                    this.loadAssetsInAssetsBundle(resPkg);
                }
            })
        }

    }

    /**
     * 获取资源
     * @param abName 资源包名
     * @param url 资源路径
     * @returns
     */
    getAsset(abName,url):any{
        var bundle = assetManager.getBundle(abName);
        if(bundle === null){
            console.log("[error]:"+abName+"AssetBundle not load !");
            return null;
        }

        return bundle.get(url); 
    }
}

在Game文件夹下创建GameResPkg脚本,内容如下:

import { Prefab } from "cc";

var ResPkg = {
    "GUI":{
        assetType: Prefab,
        urls:[
            //资源的urls。。。
        ]
    },
    //其他ab包信息。。。
};
export default ResPkg;

在GameLaunch脚本中的start方法中调用Game中的StartGame方法,并且添加上ResMgr组件到节点上:

import { _decorator, Component, Node } from 'cc';
import ResMgr from './Managers/ResMgr';
import { Game } from './Game/Game';
const { ccclass, property } = _decorator;

@ccclass('GameLaunch')
export class GameLaunch extends Component {
    private static Instance: GameLaunch = null;

    protected onLoad(): void {
        if(GameLaunch.Instance === null){
            GameLaunch.Instance = this;
        }else{
            this.destroy();
            return;
        }
        //初始化游戏框架:资源管理,声音管理,UI管理,网络管理,日志管理//...
        this.node.addComponent(ResMgr);
        this.node.addComponent(Game)
    }
    start() :void{
        //检测资源更新
        Game.Instance.StartGame();
    }
}

在Game脚本的StartGame方法中调用ResMgr预加载资源:

import ResMgr from '../Managers/ResMgr';
import ResPkg from './GameResPkg';
//.............
public StartGame():void{
        //预加载资源
        ResMgr.Instance.preloadResPkg(ResPkg,null,()=>{
            this.EnterGameScene();
        });
    }
//.......

5、调试AssetBundle资源管理框架。

在GUI文件夹中导入资源,将做好的UI预制体放在UIPrefab中:
(记得清空场景并添加Canvas)
在这里插入图片描述
在GameResPkg脚本中添加资源的urls信息:
在这里插入图片描述
将GameLaunch脚本挂载到Canvas节点上。
在Game脚本的EnterGameScene方法上释放资源:

    public EnterGameScene():void{
        //释放游戏场景,UI,角色等
        //释放菜单UI
        var mainUIProfabs = ResMgr.Instance.getAsset("GUI","UIPrefabs/MainUI");
        var mainUI = instantiate(mainUIProfabs);
        this.node.addChild(mainUI);

    }

返回cocos编辑器,运行后效果如下:
在这里插入图片描述
(UI有点丑,大家别介意哈)

二、搭建UI资源管理框架

1、创建UIManager

在Manager文件夹下创建UIMgr脚本:
在这里插入图片描述
脚本内容如下:

import { _decorator, Button, Component, instantiate, Node } from 'cc';
import ResMgr from './ResMgr';

export class UICtrl extends Component {
    protected view = {};

    /**
     * 将该节点中url路径下所有的路径名和节点加入到view中
     * @param root 节点
     * @param path url路径
     */
    load_all_object(root,path) {
        for(let i=0;i<root.childrenCount;i++){
            this.view[path+root.children[i].name] = root.children[i];
            this.load_all_object(root.children[i], path + root.children[i].name+"/");
        }        
    }

    onLoad(){
        this.view = {};
        this.load_all_object(this.node,"");
    }

    /**
     * button添加的入口函数
     * @param view_name 
     * @param caller 
     * @param func 
     * @returns 
     */
    public add_button_listen(view_name,caller,func){
        var view_node = this.view[view_name];
        if(!view_node){
            return;
        }
        
        var button = view_node.getComponent(Button);
        if(!button){
            return;
        }

        view_node.on("click",func,caller);
    }
}
/**
 * 简化UI显示代码
 */
export default class UIMgr extends Component {
    private Canvas:Node = null;
    public static Instance:UIMgr = null;
    private uiMap = {};

    onLoad(): void {
        if(UIMgr.Instance === null){
            UIMgr.Instance = this;
        }else{
            this.destroy();
            return;
        }
        this.Canvas = this.node;
    }

    /**
     * 显示ui
     * @param ui_name ui名字
     * @param parent 
     * @returns 
     */
    public show_ui(ui_name,parent?:Node):Node{
        if(!parent){
            parent = this.Canvas;
        }
        var prefab = ResMgr.Instance.getAsset("GUI","UIPrefabs/"+ui_name);//根据你ui存放的路径修改
        var item = null;
        if(prefab){
            item = instantiate(prefab);
            parent.addChild(item);
            item.addComponent(ui_name+"_Ctrl");//根据你ui脚本的名字修改   
        }
        this.uiMap[ui_name] = item;//将ui的根节点保存到map中
        return item;
    }
    /**
     * 删除ui
     * @param ui_name ui名字
     */
    public remove_ui(ui_name){
        if(this.uiMap[ui_name]){
            this.uiMap[ui_name].removeFromParent();
            this.uiMap[ui_name] = null;
        }
    }

    /**
     * 清空所有ui
     */
    public clear_All(){
        for(var key in this.uiMap){
            if(this.uiMap[key]){
                this.uiMap[key].removeFromParent();
                this.uiMap[key] = null;
            }
            
        }
    }
}

在GameLaunch脚本的onload方法中添加ui管理组件:
在这里插入图片描述

2、添加UI控制代码:

创建UIControllers文件夹用于放置ui控制脚本,创建MainUI对应 的ui脚本MainUI_Ctrl
在这里插入图片描述
脚本内容如下:

import { _decorator, Component, Node } from 'cc';
import { UICtrl } from '../../Managers/UIMgr';
const { ccclass, property } = _decorator;

@ccclass('MainUI_Ctrl')
export class MainUI_Ctrl extends UICtrl {
    onLoad(): void {
        super.onLoad();
    }
}

这里MainUI_Ctrl继承UIMgr中的UICtrl,然后调用父类的onload方法,从而将ui节点的信息以及节点进行加载,保存到view中。

3、测试UI框架

回到Game脚本中的EnterGameScene方法,清空方法内的内容,使用UIMgr中的方法来显示UI:

public EnterGameScene():void{
        //释放游戏场景,UI,角色等
        //释放菜单UI
        UIMgr.Instance.show_ui("MainUI");
    }

返回cocos运行,可以看到ui成功显示:
在这里插入图片描述
如果想要添加按钮的具体事件,直接在UI对应的ctrl脚本中添加即可。

4、修改UI文字

prefab的结构如下:
在这里插入图片描述
如果我们想要修改title中的文字内容,我们只需要在UI对应的ctrl中添加一行代码即可,我们找到MainUI_Ctrl脚本,编辑onload中的内容:

onLoad(): void {
        super.onLoad();

        //修改标题
        this.view["title"].getComponent(Label).string = "新标题";
    }

返回编辑器,运行后的结果:
在这里插入图片描述

总结

可以看到,有了ui框架的加持,可以更方便地对ui内容进行操作和管理,大大增加我们的开发效率,如果有更多需求,也可以根据需求来增加UIMgr里的功能。
如果内容有错误,欢迎批评与指正,作者看到后会及时修改。

CocosCreator3.8研究笔记(十四)CocosCreator 资源管理Asset Manager 资源管理模块具备加载资源、查找资源、销毁资源、缓存资源、Asset Bundle 等功能,帮助开发者管理其资源的使用。预加载只会下载必要的资源,不会进行反序列化和初始化工作,性能消耗小,适合在游戏过程中使用。由于预加载没有解析资源,所以需要在预加载完成后,再配合加载接口进行资源的解析和初始化。在游戏的开发过程中,需要使用到大量的图片、音频等资源来,从而带来管理上的困难。:加载不需要等到预加载完成后再调用,开发者可以在任何时候进行加载。正常加载接口会直接复用预加载过程中已经下载好的内容,缩短加载时间。 阅读详情

相关推荐

Unity与Cocos Creator深度对比:UI系统、资源管理与动画架构实战解析

在游戏开发领域,UI系统、资源管理与动画架构是决定项目开发效率与最终表现的核心技术模块。UI系统负责玩家交互界面的渲染与布局,其设计哲学直接影响开发者的工作流与性能优化策略;资源管理涉及纹理、音频等资产的加载、引用与内存释放,是项目规模扩展的基石;动画系统则通过状态机或时间轴驱动角色动作与特效,衔接游戏逻辑与视觉表现。理解这些基础概念与实现原理,对于构建稳定、高效的游戏项目具有重要工程价值。无论是开发复杂的3D游戏还是轻量级的2D应用,选择合适的引擎与架构模式都至关重要。本文聚焦Unity和Cocos Cr

weixin_30617737的博客 349

cocosCreator 之AssetManager资源管理和释放

关于Asset的引用计数,和AssetManager及Bundle的资源管理和释放

鹤九日的博客 3613

Cocos Creator新手入门:从环境搭建到安卓打包的实战指南

游戏开发是现代软件开发的重要分支,其核心在于通过引擎将创意转化为可交互的数字体验。游戏引擎作为底层框架,封装了渲染、物理、音频等复杂系统,开发者只需关注游戏逻辑的实现。Cocos Creator作为一款轻量级、跨平台的游戏引擎,凭借其对TypeScript的良好支持以及“一次开发,多平台发布”的特性,在2D和轻度3D游戏开发领域展现出显著的技术价值。它尤其适合Web前端开发者转型或独立开发者快速上手,能够高效应用于移动端小游戏、教育应用、互动广告等多种场景。本文基于一位开发者的真实入门历程,详细梳理了从环境

weixin_34357928的博客 440

cocos creator 项目总结三(资源管理方案)

一、引言 针对资源的管理,很多人项目可能都不会自己单独再封装一层管理。简单粗暴的使用引擎提供的接口直接releaseunUse。这样当然也是没问题,能很大程度上解决资源清理的问题。但是我经历过这么多项目以来,由衷的感觉一个好的资源管理会为你以后性能优化提供很大的帮助,特别是那些大型项目到后期因为场景多界面多导致资源管理复杂,而最终导致没管理好导致游戏内存效果高又没好的办法去降低(因为前期没规划好后期只能修修补补)。 二、方案的抉择 在此项目之前我一直都是用的...

xzben‘blog 4527

Cocos Creator 3.x 入门实战:从零构建点击得分游戏

游戏开发框架是现代游戏制作的核心工具,它通过封装底层图形渲染、物理模拟和资源管理等复杂模块,为开发者提供高效的一体化工作流。其技术价值在于大幅降低开发门槛,使独立开发者和小型团队能够快速实现创意并发布到多平台。在众多框架中,Cocos Creator 以其对2D和轻量级3D游戏的友好支持而著称,它基于“节点-组件”架构,结合可视化编辑器,让场景搭建和逻辑编写无缝衔接。本教程将聚焦于 **Cocos Creator 3.x** 这一主流版本,通过一个完整的 **点击得分游戏** 实战案例,手把手演示从环境配置

weixin_29474431的博客 301

Cocos Creator引擎开发:UI组件开发_UI组件资源管理

在Cocos Creator引擎开发中,UI组件的资源管理是一个非常重要的环节。合理的资源管理不仅可以提高开发效率,还能优化游戏性能,确保游戏在各种设备上运行流畅。本节将详细介绍如何在Cocos Creator中管理和优化UI组件的资源,包括资源的加载、卸载、缓存和预加载等技术。

chenlz2007的博客 1095

【亲测免费】 推荐开源项目:kxCreator - 强大的Cocos Creator 3.0框架

推荐开源项目:kxCreator - 强大的Cocos Creator 3.0框架 1、项目介绍 kxCreator 是一个专为Cocos Creator 3.0设计的强大框架,它旨在简化游戏或应用的开发过程,提供高效的资源管理、网络框架、UI系统等核心功能。这个框架的目标不仅仅是减少编码量,更是要提升开发者的体验,让开发者能够更加专注于业务逻辑,而非基础架构的细节。 2、项目技术分析 资源管理:...

gitblog_00008的博客 984

Cocos Creator游戏打包与图标个性化实战教程

Cocos Creator允许开发者创建可复用的自定义UI组件,这样可以将一些复杂的UI逻辑封装起来,简化开发流程。使用。

weixin_42602726的博客 1245

Cocos Creator 项目基础框架教程

`cocos_creator_proj_base` 是一个基于 Cocos Creator 1.5.1 的项目基础框架,旨在为开发者提供一个快速启动的模板。该框架包括了 HTTP 处理、UI 池管理、事件管理、弹窗管理以及常用的控件如 ListView 等。通过使用这个基础框架,开发者可以更高效地开始新项目的开发。 ## 项目快速启动 ### 克隆项目 首先,你需要克隆项目到本地: ```

gitblog_01179的博客 1012

蛇棋项目解析:Cocos Creator与Egret双引擎协同开发实践

跨引擎游戏开发是中小规模互动项目面临的核心工程挑战,其本质在于统一业务逻辑与差异化渲染层的解耦。本文围绕资源管理粒度、事件系统抽象、UI组件生命周期绑定三大技术难点,深入剖析一套基于Cocos Creator和白鹭引擎(Egret)双轨架构的蛇棋实现方案。通过共享逻辑层(shared)、引擎桥接总线(EngineBridge)与数据驱动UI等设计,项目实现了规则零修改、UI可热插拔、打包APK兼容适配等关键技术价值。适用于教育类小游戏开发、旧项目引擎迁移评估及中小学编程教学案例构建等典型场景,尤其为‘coc

weixin_30166691的博客 327

Cocos Creator客户端源码解析:从工程结构到玩法拆解

游戏前端开发中,Cocos Creator作为主流2D/3D引擎,其客户端源码的组织方式直接影响项目迭代效率与运行性能。理解一套完整的客户端工程,需要从资源配置、场景启动、脚本生命周期到UI栈管理、战斗逻辑及资源释放策略逐层拆解。资源管理通过.meta文件与UUID机制保证引用稳定,动态加载与图集合图是控制包体和内存的关键;UI栈与事件分发则决定了模块间的解耦程度。这些工程化实践不仅适用于三国题材小游戏,也覆盖卡牌、RPG等常见品类。掌握其原理后,开发者能快速上手他人项目,并针对构建发布、真机调试等环节进行

weixin_29708043的博客 125

Cocos Creator三消游戏开发指南:从零打造开心消消乐完整项目

开心消消乐是一款经典的三消游戏,本指南将带你使用Cocos Creator从零开始构建一个完整的开心消消乐项目。通过本教程,你将学习游戏核心机制设计、关卡配置、UI界面开发等关键步骤,快速掌握三消游戏开发的精髓。 ## 项目概述与环境准备 开心消消乐项目基于Cocos Creator引擎开发,使用TypeScript作为主要编程语言。项目结构清晰,资源文件与代码分离,便于维护和扩展。 首先需

gitblog_00441的博客 844

基于Cocos Creator的消除类小游戏PopStar完整项目实战

这套架构跑下来,你会发现:消除类游戏的本质不是“拼手速”,而是“控状态”。你写的每一行代码,都在参与一场精密的状态舞蹈。而 Cocos Creator 提供的组件化模型,恰好是最适合演绎这场舞蹈的舞台。未来你可以轻松拓展:- 加入技能系统(冻结、炸弹、彩虹球)- 实现排行榜与社交分享- 接入广告激励模块- 支持离线模式与本地存档真正的挑战从来不在技术本身,而在你能否把复杂的机制,包装成人人愿意玩、乐意分享的乐趣。所以,别再问“三消游戏还有机会吗?

weixin_35899324的博客 834

提升效率!Cocos Creator网页调试终极指南:ccc-devtools深度解析

在游戏开发过程中,网页调试是每个Cocos Creator开发者都会遇到的挑战。传统的调试方式往往效率低下,无法实时监控场景变化。针对这一痛点,ccc-devtools应运而生,作为一款专业的Cocos Creator调试工具,它为网页调试提供了全新的解决方案,让游戏开发工具的使用体验得到质的飞跃。 ## 调试困境:传统方式的局限性 在常规的Cocos Creator开发流程中,开发者经常面临

gitblog_01193的博客 943

Cocos Creator枪神之神游戏源码完整解析与实战开发

有些变量你是真不想每次都声明,比如全局调试标志:export {};记得在的include中包含这个文件路径哦~之后你在任何地方都能放心使用:cc.log("当前处于调试模式");不会有类型错误,也不会被 lint 报警。最后送你一张对比表,直观感受不同配置带来的差异:配置状态智能提示准确率错误发现时机团队协作成本无任何配置< 40%运行时报错高仅基本 include~60%编辑时部分提示中。

weixin_32535825的博客 1057

Cocos Creator开发三消类休闲游戏实战:开心消消乐

三消游戏的核心机制围绕“交换相邻元素”、“检测匹配”、“消除匹配元素”、“重力下落补充”等四个关键步骤展开。理解这些机制的流程和数据结构设计,是开发三消游戏的第一步。本章内容将为读者梳理从设计关卡系统到多平台发布的完整开发流程,帮助开发者掌握关键节点与常见问题的应对策略。

weixin_28850145的博客 960

探索FairyGUI-CocosCreator:打造高效UI开发的新篇章

是一个专门为Cocos Creator游戏引擎设计的UI框架,旨在简化游戏和应用的UI系统开发流程,提供更高效、灵活且易于维护的解决方案。本文将深入探讨该项目的技术特性,应用场景及优势,帮助开发者更好地利用它提升工作效率。 ## 项目简介 FairyGUI-CocosCreator是FairyGUI系列的一个分支,专为Cocos Creator量身定制。它基于强大的事件驱动机制,支持图形化编辑...

gitblog_00087的博客 855

FairyGUI-cocoscreator:Cocos Creator 的灵活 UI 框架

FairyGUI-cocoscreator A flexible UI framework for Cocos Creator, working with the FREE professional Game UI Editor: FairyGUI Editor. Official website: 关于版本 master 适用于CocosCreator 2.4或更新的版本 ccc3.0 适用于CocosCreator 3.0及以上版本 ccc2.1-2.3 适用于CocosCreator 2.1-2.3版本 ccc2.0 适用于CocosCreator 2.0版本 不支持CocosCreator 1.x版本 目录结构 source fairygui的源码 demo 例子工程,可用CocosCreator直接打开 UIProject UI 工程,可以FairyGUI编辑器打开 获取fair

上一篇: 【Cocos Creator 使用AssetBundle管理资源】
吊云
博客等级 码龄6年 73粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值