EnemyCreater.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using cfg;
  5. using System.Threading.Tasks;
  6. using Base.Common;
  7. public class EnemyCreater : MonoBehaviour
  8. {
  9. public static EnemyCreater instance;
  10. public List<SingleCreateEnemyConfig> cfgCreateEnemy;
  11. public List<bool> created;
  12. public Dictionary<int, List<Enemy>> enemyDic;
  13. private void Awake()
  14. {
  15. if (!instance)
  16. {
  17. instance = this;
  18. }
  19. else
  20. {
  21. DestroyImmediate(gameObject);
  22. return;
  23. }
  24. enemyDic = new Dictionary<int, List<Enemy>>();
  25. }
  26. private void Start()
  27. {
  28. cfgCreateEnemy = GameManager.instance.allCfgData.CfgCreateEnemy.DataList;
  29. created = new List<bool>();
  30. for (int i = 0; i < cfgCreateEnemy.Count; i++)
  31. {
  32. created.Add(false);
  33. }
  34. }
  35. public void OnGameTimeChange(float gameTime)
  36. {
  37. for (int i = 0; i < cfgCreateEnemy.Count; i++)
  38. {
  39. if (cfgCreateEnemy[i].Time <= gameTime && !created[i])
  40. {
  41. created[i] = true;
  42. StartCreateEnemy(i);
  43. }
  44. }
  45. }
  46. public async void StartCreateEnemy(int id)
  47. {
  48. SingleCreateEnemyConfig singleCreateEnemy = cfgCreateEnemy[id];
  49. for (int i = 0; i < singleCreateEnemy.Count; i++)
  50. {
  51. if (!instance)
  52. {
  53. return;
  54. }
  55. Vector3 pos = new Vector3(singleCreateEnemy.Position[0], singleCreateEnemy.Position[1] + Random.Range(-singleCreateEnemy.YRandomRange/2, singleCreateEnemy.YRandomRange / 2), singleCreateEnemy.Position[2]);
  56. CreateEnemy(singleCreateEnemy.EnemyID, pos, singleCreateEnemy.HPRatio, singleCreateEnemy.AttackRatio);
  57. await Task.Delay((int)(singleCreateEnemy.TimeInterval * 1000));
  58. }
  59. }
  60. public void CreateEnemy(int enemyId, Vector3 pos, float hpRatio, float attackRatio)
  61. {
  62. SingleEnemyConfig cfgEnemy = GameManager.instance.allCfgData.CfgEnemy.Get(enemyId);
  63. GameObject enemyObj = Util.Instantiate(cfgEnemy.EnemyPrefab, pos);
  64. Enemy enemy = enemyObj.GetComponent<Enemy>();
  65. enemy.id = enemyId;
  66. if (!enemyDic.ContainsKey(enemyId))
  67. {
  68. enemyDic.Add(enemyId, new List<Enemy>());
  69. }
  70. enemyDic[enemyId].Add(enemy);
  71. enemy.totalHp = (int)(cfgEnemy.HP * hpRatio);
  72. for (int i = 0; i < cfgEnemy.Attack1.Count; i++)
  73. {
  74. AttackInfo attackInfo = enemy.attack1Infos[i];
  75. attackInfo.damage = (int)(cfgEnemy.Attack1[i] * attackRatio);
  76. enemy.attack1Infos[i] = attackInfo;
  77. }
  78. for (int i = 0; i < cfgEnemy.Attack1.Count; i++)
  79. {
  80. AttackInfo attackInfo = enemy.attack2Infos[i];
  81. attackInfo.damage = (int)(cfgEnemy.Attack2[i] * attackRatio);
  82. enemy.attack2Infos[i] = attackInfo;
  83. }
  84. if (enemy.canFly)
  85. {
  86. enemy.flyHeight = enemy.transform.position.y;
  87. }
  88. enemy.Init();
  89. enemy.SetSortingOrder(cfgEnemy.SortingOrder + enemyDic[enemyId].Count);
  90. }
  91. public void OnEnemyRecycle(Enemy enemy)
  92. {
  93. if (!enemyDic.ContainsKey(enemy.id))
  94. {
  95. return;
  96. }
  97. enemyDic[enemy.id].Remove(enemy);
  98. SingleEnemyConfig cfgEnemy = GameManager.instance.allCfgData.CfgEnemy.Get(enemy.id);
  99. for (int i = 0; i < enemyDic[enemy.id].Count; i++)
  100. {
  101. enemyDic[enemy.id][i].SetSortingOrder(cfgEnemy.SortingOrder + i);
  102. }
  103. }
  104. public Enemy GetMinDisOtherEnemy(Enemy self)
  105. {
  106. Enemy minDisEnemy = null;
  107. foreach (var item in enemyDic)
  108. {
  109. for (int i = 0; i < item.Value.Count; i++)
  110. {
  111. if (item.Value[i] != self && !item.Value[i].isDie && item.Value[i].gameObject.activeInHierarchy)
  112. {
  113. if (!minDisEnemy || (minDisEnemy.transform.position - self.transform.position).magnitude
  114. > (item.Value[i].transform.position - self.transform.position).magnitude)
  115. {
  116. minDisEnemy = item.Value[i];
  117. }
  118. }
  119. }
  120. }
  121. return minDisEnemy;
  122. }
  123. }