您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

102 行
3.1 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using CIGEnums;
  5. using SUISSEngine;
  6. using UnityEngine;
  7. public class CIGAnimalManager : MonoBehaviour
  8. {
  9. private void Start()
  10. {
  11. this.animalAllowedTiles = this.horsePrefabs[0].GetComponent<AttachedElementTypeList>();
  12. base.transform.position = this.grid.transform.position;
  13. this.InitialiseAnimals();
  14. }
  15. private void InitialiseAnimals()
  16. {
  17. List<CIGExpansions.ExpansionBlock> freeBlocks = this.GetFreeBlocks();
  18. if (freeBlocks.Count == 0)
  19. {
  20. UnityEngine.Debug.LogWarning("No free blocks for animals; no animals");
  21. return;
  22. }
  23. CIGExpansions.ExpansionBlock block = freeBlocks[UnityEngine.Random.Range(0, freeBlocks.Count)];
  24. List<GridElement> suitableElements = this.GetSuitableElements(block);
  25. List<Boid> list = new List<Boid>();
  26. for (int i = 0; i < this.animalCount; i++)
  27. {
  28. CIGMovingUnit cigmovingUnit = this.CreateHorseAt(new GridPoint(suitableElements[UnityEngine.Random.Range(0, suitableElements.Count)].Index));
  29. cigmovingUnit.SetTargetLocation(new GridPoint(suitableElements[UnityEngine.Random.Range(0, suitableElements.Count)].Index));
  30. list.Add(cigmovingUnit.GetComponent<Boid>());
  31. }
  32. foreach (Boid boid in list)
  33. {
  34. boid.SetHerd(list);
  35. }
  36. }
  37. private CIGMovingUnit CreateHorseAt(GridPoint place)
  38. {
  39. GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(this.horsePrefabs[UnityEngine.Random.Range(0, this.horsePrefabs.Count<GameObject>())]);
  40. gameObject.transform.parent = base.transform;
  41. CIGMovingUnit component = gameObject.GetComponent<CIGMovingUnit>();
  42. component.SpawnAt(this.grid, place);
  43. return component;
  44. }
  45. private List<CIGExpansions.ExpansionBlock> GetFreeBlocks()
  46. {
  47. List<CIGExpansions.ExpansionBlock> list = new List<CIGExpansions.ExpansionBlock>();
  48. foreach (CIGExpansions.ExpansionBlock expansionBlock in this.expansions.AllBlocks)
  49. {
  50. if (expansionBlock != null)
  51. {
  52. if (this.animalAllowedTiles == null)
  53. {
  54. UnityEngine.Debug.LogError("Animal prefab has no attached element type list, to get the allowed tiles to walk on");
  55. }
  56. else if (!expansionBlock.Unlocked && this.GetSuitableElements(expansionBlock).Count > expansionBlock.AvailableElements / 2)
  57. {
  58. list.Add(expansionBlock);
  59. }
  60. }
  61. }
  62. return list;
  63. }
  64. private List<GridElement> GetSuitableElements(CIGExpansions.ExpansionBlock block)
  65. {
  66. List<GridElement> list = new List<GridElement>();
  67. for (int i = block.Origin.u; i < block.Origin.u + block.Size.u; i++)
  68. {
  69. for (int j = block.Origin.v; j < block.Origin.v + block.Size.v; j++)
  70. {
  71. GridElement gridElement = this.grid[i, j];
  72. foreach (SurfaceType surfaceType in this.animalAllowedTiles.elementTypes)
  73. {
  74. if (gridElement.Type == (int)surfaceType)
  75. {
  76. list.Add(gridElement);
  77. }
  78. }
  79. }
  80. }
  81. return list;
  82. }
  83. [SerializeField]
  84. private IsometricGrid grid;
  85. [SerializeField]
  86. private CIGExpansions expansions;
  87. [SerializeField]
  88. private GameObject[] horsePrefabs;
  89. public int animalCount = 10;
  90. private AttachedElementTypeList animalAllowedTiles;
  91. }