EnemyComponent.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { _decorator, CCBoolean, CCFloat, Collider, Component, isValid, ITriggerEvent, Node, PhysicsSystem, tween, Tween, Vec3 } from 'cc';
  2. import { EventDispatcher } from 'db://assets/core_tgx/easy_ui_framework/EventDispatcher';
  3. import { GameEvent } from '../Enum/GameEvent';
  4. const { ccclass, property } = _decorator;
  5. export enum EnemyStatus {
  6. LIFE,
  7. DIE
  8. }
  9. @ccclass('EnemyComponent')
  10. export class EnemyComponent extends Component {
  11. currentHp: number = 0;
  12. status: EnemyStatus = EnemyStatus.LIFE;
  13. speed: number = 50;
  14. headshot:boolean = false;
  15. tigger: Collider = null!;
  16. protected onLoad(): void {
  17. this.tigger = this.node.getComponent(Collider)!;
  18. }
  19. start() {
  20. this.status = EnemyStatus.LIFE;
  21. this.tigger = this.node.getComponent(Collider)!;
  22. this.registerEvent();
  23. }
  24. private registerEvent() {
  25. this.tigger.on('onTriggerEnter', this.onTriggerEnter, this);
  26. EventDispatcher.instance.on(GameEvent.EVENT_CAMERA_SHOOT_ENEMY, this.onShootEnemy, this);
  27. }
  28. private unRegisterEvent() {
  29. this.tigger.off('onTriggerEnter', this.onTriggerEnter, this);
  30. }
  31. protected onTriggerEnter(event: ITriggerEvent): void {
  32. }
  33. private onShootEnemy(hitNode: Node){
  34. // 检查是否是当前怪物节点被击中
  35. if(this.node === hitNode && this.status === EnemyStatus.LIFE) {
  36. this.status = EnemyStatus.DIE;
  37. // 播放死亡动画或效果
  38. tween(this.node)
  39. .to(0.3, { scale: new Vec3(0, 0, 0) })
  40. .call(() => {
  41. // 销毁怪物节点
  42. this.node.destroy();
  43. })
  44. .start();
  45. }
  46. }
  47. protected onDestroy(): void {
  48. Tween.stopAllByTarget(this.node);
  49. this.unRegisterEvent();
  50. }
  51. }