EnemyManager.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace WildAttack
  5. {
  6. /// <summary>
  7. /// 敌人管理器
  8. /// </summary>
  9. public class EnemyManager : Singleton<EnemyManager>
  10. {
  11. /// <summary>
  12. /// 存放场上存活敌人(不包含初始怪)
  13. /// </summary>
  14. public List<Enemy> enemyList;
  15. #region Functions
  16. public void Init()
  17. {
  18. enemyList = new List<Enemy>();
  19. CreateWayPoint();
  20. }
  21. /// <summary>
  22. /// 敌人管理器生成敌人方法
  23. /// </summary>
  24. /// <param name="monsterId"></param>
  25. /// <param name="spawnGroupId"></param>
  26. public void CreateEnemy(int monsterId, int spawnGroupId)
  27. {
  28. Enemy enemy;
  29. // 武器权重
  30. MonsterData data = MonsterModule.GetInstance().GetData(monsterId);
  31. int weaponId = WeightRandomUtils.GetInstance().GetRandomId(data.weponWeight);
  32. //int weaponId = 3;
  33. if (weaponId == -1) return;
  34. GameObject obj;
  35. // 判断是否初始怪
  36. if (spawnGroupId <= 0)
  37. {
  38. // 新生成
  39. obj = GameObject.Instantiate(Resources.Load<GameObject>("Enemy/yellow/duyanguai_skin_flag"));
  40. }
  41. else
  42. {
  43. // 从池中取
  44. obj = EnemyPool.GetInstance().GetGameObject(weaponId);
  45. }
  46. obj.SetActive(true);
  47. // 添加脚本
  48. enemy = obj.GetComponent<Enemy>();
  49. if (enemy == null)
  50. {
  51. enemy = obj.AddComponent<Enemy>();
  52. }
  53. // 调用初始化
  54. enemy.Init(monsterId, weaponId, spawnGroupId);
  55. enemyList.Add(enemy);
  56. }
  57. GameObject[] wayPointObjs;
  58. /// <summary>
  59. /// 读表获取三个出生点
  60. /// </summary>
  61. public void CreateWayPoint()
  62. {
  63. // 读表get坐标 spawnGroup总数
  64. wayPointObjs = new GameObject[3];
  65. Vector3[] ve3Arr = new Vector3[3];
  66. for (int i = 0; i < ve3Arr.Length; i++)
  67. {
  68. Vector2 ve2 = WayPointModule.GetInstance().GetDataByGroup(i + 1)[0].wayPoint[0];
  69. ve3Arr[i] = new Vector3(ve2.x, 35, ve2.y);
  70. }
  71. // 生成emptyObj set layer collider等
  72. for (int i = 0; i < ve3Arr.Length; i++)
  73. {
  74. GameObject obj = new GameObject();
  75. obj.name = "wayPoint" + (i + 1);
  76. obj.transform.position = ve3Arr[i] + Vector3.up * 2;
  77. obj.layer = LayerMask.NameToLayer("WayPoint");
  78. SphereCollider collider = obj.AddComponent<SphereCollider>();
  79. collider.radius = 3;
  80. collider.isTrigger = true;
  81. wayPointObjs[i] = obj;
  82. }
  83. // 射线检测地面 getY轴坐标
  84. foreach (var item in wayPointObjs)
  85. {
  86. Ray ray = new Ray(item.transform.position, -item.transform.up);
  87. RaycastHit hitInfo;
  88. if (Physics.Raycast(ray, out hitInfo, 100, 1 << LayerMask.NameToLayer("Plane")))
  89. {
  90. if (hitInfo.collider.gameObject.layer == LayerMask.NameToLayer("Plane"))
  91. {
  92. item.transform.position = new Vector3(item.transform.position.x, hitInfo.point.y, item.transform.position.z);
  93. }
  94. }
  95. }
  96. }
  97. public GameObject[] GetWayPoints()
  98. {
  99. return wayPointObjs;
  100. }
  101. /// <summary>
  102. /// 游戏结束
  103. /// </summary>
  104. public void GameOver()
  105. {
  106. // 对场上敌人重新设置新的目标点(城门内建筑)
  107. foreach (var item in enemyList)
  108. {
  109. // set new WayPoint
  110. item.SetNewWayPoint(4);
  111. }
  112. }
  113. #endregion
  114. }
  115. }