本指南将帮助你在Cocos Creator中正确设置游戏状态管理系统,实现血量监控和胜利失败UI显示功能。
确保你的场景中已经有以下节点结构:
Canvas/
├── GameLevelUI/
│ ├── HeartNode/
│ │ └── HeartLabeld (Label组件,显示血量)
│ ├── EnemyController (挂载EnemyController脚本)
│ └── GameManager (挂载增强版GameManager脚本)
├── GameSuccess (游戏成功UI,初始设为不激活)
└── GameDefeat (游戏失败UI,初始设为不激活)
在 Canvas/GameLevelUI/GameManager 节点的Inspector面板中设置以下属性:
原GameManager属性:
游戏状态管理属性:
Canvas/GameLevelUI/HeartNode/HeartLabeld 节点Canvas/GameSuccess 节点Canvas/GameDefeat 节点游戏配置属性:
Canvas/GameSuccess/
├── NextLevelBtn (Button组件)
├── RestartBtn (Button组件)
├── MainMenuBtn (Button组件)
└── ShopBtn (Button组件)
Canvas/GameDefeat/
├── RestartBtn (Button组件)
├── MainMenuBtn (Button组件)
├── ShopBtn (Button组件)
└── ReviveBtn (Button组件)
注意: 按钮节点名称必须严格按照上述命名,脚本会根据名称自动查找和绑定事件。
确保场景中有以下管理器节点:
LevelManager 脚本ShopManager 脚本ConfigManager 脚本GameManager 每秒检查 HeartLabeld 的文本内容GameManager 通过 EnemyController 获取当前敌人数量GameManager 处理所有按钮点击事件// 在控制台或其他脚本中调用
const gameManager = find('Canvas/GameLevelUI/GameManager').getComponent('GameManager');
// 强制触发游戏成功
gameManager.forceGameSuccess();
// 强制触发游戏失败
gameManager.forceGameDefeat();
// 手动设置血量
gameManager.setHealth(50);
// 造成伤害
gameManager.takeDamage(20);
LevelSystem/GameManager.ts你可以根据需要扩展以下功能:
Q: 血量检测不工作? A: 检查HeartLabeld节点路径和Label组件是否正确设置
Q: 按钮点击无响应? A: 检查按钮节点命名是否正确,Button组件是否添加
Q: 敌人检测不准确? A: 确保EnemyController的getCurrentEnemyCount方法正常工作
Q: 管理器获取失败? A: 检查LevelManager和ShopManager是否正确初始化为单例
Q: 找不到GameManager脚本?
A: 确保使用的是 LevelSystem/GameManager.ts 中的增强版GameManager
BlockManager 现在已经集成了武器系统,可以根据武器配置生成带有不同武器属性的方块。每个方块都关联一个武器配置,包含武器的视觉效果、属性和战斗参数。
确保场景中包含以下节点:
// 获取方块的武器配置
const weaponConfig = blockManager.getBlockWeaponConfig(blockNode);
if (weaponConfig) {
console.log(`武器名称: ${weaponConfig.name}`);
console.log(`武器类型: ${weaponConfig.type}`);
console.log(`武器稀有度: ${weaponConfig.rarity}`);
console.log(`武器伤害: ${weaponConfig.stats.damage}`);
}
// 获取方块的武器ID
const weaponId = blockManager.getBlockWeaponId(blockNode);
// 重新生成三个新的武器方块
blockManager.refreshBlocks();
方块预制体应该包含以下结构:
WeaponBlock (根节点)
├── B1 (主要方块节点)
│ └── Weapon (武器图标节点,需要 Sprite 组件)
└── Price (价格标签节点,可选)
武器配置文件需要包含以下信息:
可以修改 selectPrefabForWeapon 方法来根据武器类型选择不同的预制体:
private selectPrefabForWeapon(weaponConfig: WeaponConfig): Prefab | null {
// 根据武器类型选择预制体
switch (weaponConfig.type) {
case 'rifle':
return this.riflePrefab;
case 'pistol':
return this.pistolPrefab;
default:
return this.blockPrefabs[0];
}
}
方块放置后,可以通过武器配置来设置战斗效果:
// 在方块放置成功后
const weaponConfig = this.getBlockWeaponConfig(block);
if (weaponConfig) {
// 设置攻击属性
block['attackDamage'] = weaponConfig.stats.damage;
block['attackRange'] = weaponConfig.stats.range;
block['fireRate'] = weaponConfig.stats.fireRate;
}
系统会输出详细的调试信息:
Canvas/PlacedBlocksCanvas/GameLevelUI/PlacedBlocks为了提高系统的灵活性和避免硬编码路径问题,现在所有关键节点都支持通过编辑器拖拽设置:
在 Canvas/GameLevelUI/BlockController 节点上的 BlockManager 脚本中设置:
属性设置:
Canvas/GameLevelUI/GameArea/GridContainer 节点Canvas/GameLevelUI/BlockSelectionUI/diban/kuang 节点Canvas/GameLevelUI/CoinNode/CoinLabel 节点Canvas/GameLevelUI/PlacedBlocks 节点 ✨新增在 Canvas/GameLevelUI/EnemyController 节点上的 EnemyController 脚本中设置:
属性设置:
Canvas/GameLevelUI/enemyContainer 节点 ✨新增在球控制器脚本中设置:
属性设置:
Canvas/GameLevelUI/PlacedBlocks 节点 ✨新增如果未通过拖拽设置节点,系统会自动尝试查找:
placedBlocksContainer: Canvas/GameLevelUI/PlacedBlocksenemyContainer: Canvas/GameLevelUI/enemyContainerplacedBlocksContainer: Canvas/GameLevelUI/PlacedBlocksCanvas/GameLevelUI/ 下现在小球不会在游戏开始时自动出现和运动,而是等待玩家点击确定按钮后才开始:
GameLevel 场景加载
↓
BallController.start() 执行
↓
只进行基础设置(calculateGameBounds, logCollisionMatrix)
↓
等待确定按钮点击...
用户点击 confirm 按钮
↓
GameManager.onConfirmButtonClicked() 执行
↓
GameManager.startGame() 执行
↓
GameManager.spawnBall() 执行
↓
BallController.startBall() 执行
↓
小球创建、定位(避开方块)、开始运动
startBall(): 启动小球系统的主要方法
spawnBall(): 现在调用 startBall() 而不是 initialize()initialized: 是否已初始化(创建小球但未运动)ballStarted: 是否已开始运动positionBallRandomly()确保以下组件正确设置:
Canvas/GameLevelUI/BlockSelectionUI/diban/confirmGameManager.onConfirmButtonClicked()Q: 点击确定按钮后小球没有出现? A: 检查 GameManager 的 Ball Controller 属性是否正确设置
Q: 小球出现但不运动? A: 检查 BallController 的物理组件设置和碰撞矩阵配置
Q: 小球与方块重叠? A: 检查 PlacedBlocks 容器路径是否正确,确保方块已正确放置到容器中
Q: 确定按钮点击无响应? A: 检查按钮的点击事件绑定和 GameManager 组件设置