Oops Framework-4-Oops Framework入口类Root.ts

OOPS项目的入口场景结构是固定的。Root节点下有一个空节点game和一个UI节点gui。而root节点必须要挂载入口类,这里命名是Main,Main要继承Root类控制整个游戏的流程。

核心基类 Root.ts游戏的 Main 必须继承它

一、Root类是干嘛的?

Root 实际上是 oops 框架的总控制器 它负责:

  1. 加载框架配置
  2. 初始化所有核心模块(音频、UI、计时器、ECS、存储、网络)
  3. 管理游戏的显示 / 隐藏(切后台、切前台)
  4. 提供给子类 Main 继承并实现游戏逻辑
  5. 每帧驱动 ECS 系统

二、导入部分

复制代码
import { Component, Game, JsonAsset, Node, _decorator, director, game, log, sys, view } from "cc";

Cocos 引擎核心 API

复制代码
import { LanguageManager } from "../libs/gui/language/Language";
import { BuildTimeConstants } from "../module/config/BuildTimeConstants";
import { GameConfig } from "../module/config/GameConfig";
import { GameQueryConfig } from "../module/config/GameQueryConfig";
import { oops, version } from "./Oops";

oops 框架自己的工具、配置、语言、全局对象 oops.xxx

复制代码
import { AudioManager } from "./common/audio/AudioManager";
import { EventMessage } from "./common/event/EventMessage";
import { GameManager } from "./game/GameManager";
import { GUI } from "./gui/GUI";
import { LayerManager } from "./gui/layer/LayerManager";
import { TimerManager } from "./common/timer/TimerManager";

音频、事件、游戏管理、UI、层级、计时器


三、类定义

复制代码
@ccclass('Root')
export class Root extends Component {

标准 Cocos 组件,所有游戏场景的根节点脚本都挂它。


四、编辑器可见属性(面板上能看到)

复制代码
/** 游戏层节点 */
@property({ type: Node, tooltip: "游戏层" })
game: Node = null!;

/** 界面层节点 */
@property({ type: Node, tooltip: "界面层" })
gui: Node = null!;

作用:

  • game:放角色、怪物、场景、特效
  • gui:放 UI、弹窗、按钮、导航

这就是 oops 的 两层结构游戏内容层 + UI层 分离


五、onLoad ------ 框架启动的真正入口

复制代码
onLoad() {
    console.log(`Oops Framework v${version}`);
    this.enabled = false;   // 先关闭 update,等配置加载完再开启

重点:加载 config.json

复制代码
let config_name = "config";
oops.res.load(config_name, JsonAsset, () => {
    var config = oops.res.get(config_name);

加载框架配置文件:resources/config.json 这个文件里写了:

  • 游戏版本
  • 服务器地址
  • 帧率
  • 加密密钥
  • 热更地址
  • 等等...

配置初始化

ts

复制代码
oops.config.btc = new BuildTimeConstants();
oops.config.query = new GameQueryConfig();
oops.config.game = new GameConfig(config);

网络、存储、帧率设置

ts

复制代码
oops.http.server = 地址       // 网络请求地址
oops.http.timeout = 超时       // 超时时间
oops.storage.init(加密key)    // 本地存储加密
game.frameRate = 60           // 游戏帧率

配置加载完成 → 正式启动框架

ts

复制代码
this.enabled = true;
this.init();       // 初始化所有模块
this.run();        // 子类(Main)重写,启动游戏逻辑

六、update ------ 每帧执行

ts

复制代码
update(dt: number) {
    oops.ecs.execute(dt);
}

驱动整个 ECS 系统运行 所有 System 的 update 都从这里来。


七、init () ------ 框架核心初始化(最重要)

ts

复制代码
protected init() {

1. 创建持久根节点(切场景不销毁)

ts

复制代码
this.persistRootNode = new Node("PersistRootNode");
director.addPersistRootNode(this.persistRootNode);

放:音频、计时器、全局管理

2. 初始化音频

ts

复制代码
oops.audio = this.persistRootNode.addComponent(AudioManager);
oops.audio.load();

3. 初始化计时器

ts

复制代码
oops.timer = this.persistRootNode.addComponent(TimerManager)!;

4. 初始化多语言

ts

复制代码
oops.language = new LanguageManager();

5. 初始化游戏层、UI 层

ts

复制代码
oops.game = new GameManager(this.game);
oops.gui = new LayerManager(this.gui);

6. 让子类初始化自己的 UI 和 ECS

复制代码
this.initGui();         // 子类 Main 重写
this.initEcsSystem();   // 子类 Main 重写
oops.ecs.init();        // 启动 ECS 框架

7. 游戏切前台(EVENT_SHOW)

复制代码
game.on(Game.EVENT_SHOW, () => {
    oops.timer.load();      // 恢复计时
    oops.audio.resumeAll(); // 恢复声音
    director.resume();      // 恢复游戏
    game.resume();
    oops.message.dispatchEvent(EventMessage.GAME_ENTER);
});

8. 游戏切后台(EVENT_HIDE)

复制代码
game.on(Game.EVENT_HIDE, () => {
    oops.timer.save();      // 保存计时
    oops.audio.pauseAll();  // 暂停声音
    director.pause();       // 暂停游戏
    game.pause();
    oops.message.dispatchEvent(EventMessage.GAME_EXIT);
});

9. PC 窗口大小改变时自动适配 UI

复制代码
view.setResizeCallback(() => {
    c_gui.resize();
    oops.message.dispatchEvent(EventMessage.GAME_RESIZE);
});

八、三个留给子类重写的方法

复制代码
protected initGui() { }
protected initEcsSystem() { }
protected run() { }

initGui管理UI,initEcsSystem管理Game,run方法是框架的配置加载完成后所做的执行

整个流程是固定的,在 Main.ts 基本上只需要重写这三个方法


总结

Root 类做了 6 件事:

  1. 加载 config.json 配置

  2. 初始化音频、计时器、语言、网络、存储、UI、ECS

  3. 管理游戏前后台切换

  4. 每帧驱动 ECS

  5. 提供两层结构:game (游戏) + gui (界面)

  6. 把管理权扔给子类 Main 实现游戏逻辑

    export class Main extends Root

就是继承这个类,启动整个游戏

相关推荐
每周报刊2 天前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设
X12499281812 天前
无畏契约更新后卡顿掉帧怎么办?黑屏闪退、游戏打不开解决方法
游戏
wind100322 天前
VC++ 运行库 vcredist 安装失败|CLR 80131522 报错完整修复
开发语言·c++·游戏
Behaviour2 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎
2601_966563522 天前
安卓单机游戏合集免费下载 内置修改版无限金币 2.3T 5000+游戏 无限金币、钻石、解锁全角色等修改
游戏
●VON3 天前
谁小时候不想要一个游戏修改器?我把电脑 Skill 做成了 Android 小助手
android·游戏·电脑
本原财经3 天前
卖游戏、筹H股,昆仑万维临IPO磨AI含金量
人工智能·游戏
FairGuard手游加固3 天前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
智恒百亿4 天前
RTX 5090 全场景技术应用解析:从游戏算力到专业生产力落地
大数据·服务器·游戏
cd_949217214 天前
AI纹理和Substance Painter手绘纹理哪个更适合游戏资产制作?
人工智能·游戏·substance painter