import { _decorator, Component, Node, Vec3, RigidBody2D, Collider2D, Contact2DType, IPhysics2DContact, Sprite, find, Prefab, instantiate } from 'cc'; import { BundleLoader } from '../../Core/BundleLoader'; import { Audio } from '../../AudioManager/AudioManager'; import EventBus, { GameEvents } from '../../Core/EventBus'; import { EnemyProjectileInstance } from './EnemyProjectileInstance'; const { ccclass, property } = _decorator; /** * 敌人抛掷物管理器 * 负责管理敌人发射的抛掷物的创建和配置 * 挂载到Canvas/GameLevelUI/EnemyController上使用 */ @ccclass('EnemyProjectile') export class EnemyProjectile extends Component { @property(Prefab) public projectilePrefab: Prefab = null; onLoad() { console.log('[EnemyProjectile] 敌人抛掷物管理器已加载'); } /** * 创建抛掷物 * @param config 抛掷物配置 */ public createProjectile(config: { damage: number; speed: number; direction: Vec3; projectileType: string; startPosition: Vec3; }): Node | null { console.log('[EnemyProjectile] 开始创建抛掷物,配置:', config); if (!this.projectilePrefab) { console.error('[EnemyProjectile] 抛掷物预制体未设置'); return null; } console.log('[EnemyProjectile] 预制体已设置,开始实例化'); // 实例化预制体 const projectileNode = instantiate(this.projectilePrefab); if (!projectileNode) { console.error('[EnemyProjectile] 创建抛掷物节点失败'); return null; } console.log('[EnemyProjectile] 抛掷物节点创建成功,节点名称:', projectileNode.name); // 获取抛掷物组件 const projectileComponent = projectileNode.getComponent(EnemyProjectileInstance); if (!projectileComponent) { console.error('[EnemyProjectile] 预制体中未找到EnemyProjectileInstance组件'); projectileNode.destroy(); return null; } console.log('[EnemyProjectile] 准备添加到Canvas并设置位置'); // 添加到Canvas const canvas = find('Canvas'); if (canvas) { // 先添加到Canvas,然后设置世界坐标 canvas.addChild(projectileNode); // 确保在Canvas坐标系下正确设置位置 projectileNode.setWorldPosition(config.startPosition); console.log('[EnemyProjectile] 已添加到Canvas并设置位置,开始初始化'); // 初始化抛掷物(此时位置已正确,避免弧线弹道朝错方向) projectileComponent.init(config); console.log(`[EnemyProjectile] 创建抛掷物成功: 类型=${config.projectileType}, 伤害=${config.damage}, 速度=${config.speed}`); console.log('[EnemyProjectile] 抛掷物世界坐标:', projectileNode.worldPosition); console.log('[EnemyProjectile] 抛掷物本地坐标:', projectileNode.position); } else { console.error('[EnemyProjectile] 未找到Canvas节点'); projectileNode.destroy(); return null; } return projectileNode; } }