DungenCharacter.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3. using UnityEngine;
  4. namespace DunGen
  5. {
  6. public delegate void DungenCharacterDelegate(DungenCharacter character);
  7. public delegate void CharacterTileChangedEvent(DungenCharacter character, Tile previousTile, Tile newTile);
  8. /// <summary>
  9. /// Contains information about the dungeon the character is in
  10. /// </summary>
  11. [AddComponentMenu("DunGen/Character")]
  12. public class DungenCharacter : MonoBehaviour
  13. {
  14. #region Statics
  15. public static event DungenCharacterDelegate CharacterAdded;
  16. public static event DungenCharacterDelegate CharacterRemoved;
  17. public static ReadOnlyCollection<DungenCharacter> AllCharacters { get; private set; }
  18. private static readonly List<DungenCharacter> allCharacters = new List<DungenCharacter>();
  19. static DungenCharacter()
  20. {
  21. AllCharacters = new ReadOnlyCollection<DungenCharacter>(allCharacters);
  22. }
  23. #endregion
  24. public Tile CurrentTile
  25. {
  26. get
  27. {
  28. if (overlappingTiles == null || overlappingTiles.Count == 0)
  29. return null;
  30. else
  31. return overlappingTiles[overlappingTiles.Count - 1];
  32. }
  33. }
  34. public event CharacterTileChangedEvent OnTileChanged;
  35. private List<Tile> overlappingTiles;
  36. protected virtual void OnEnable()
  37. {
  38. if (overlappingTiles == null)
  39. overlappingTiles = new List<Tile>();
  40. allCharacters.Add(this);
  41. if (CharacterAdded != null)
  42. CharacterAdded(this);
  43. }
  44. protected virtual void OnDisable()
  45. {
  46. allCharacters.Remove(this);
  47. if (CharacterRemoved != null)
  48. CharacterRemoved(this);
  49. }
  50. internal void ForceRecheckTile()
  51. {
  52. overlappingTiles.Clear();
  53. foreach (var tile in UnityUtil.FindObjectsByType<Tile>())
  54. if (tile.Placement.Bounds.Contains(transform.position))
  55. {
  56. OnTileEntered(tile);
  57. break;
  58. }
  59. }
  60. protected virtual void OnTileChangedEvent(Tile previousTile, Tile newTile) { }
  61. internal void OnTileEntered(Tile tile)
  62. {
  63. if (overlappingTiles.Contains(tile))
  64. return;
  65. var previousTile = CurrentTile;
  66. overlappingTiles.Add(tile);
  67. if (CurrentTile != previousTile)
  68. {
  69. OnTileChanged?.Invoke(this, previousTile, CurrentTile);
  70. OnTileChangedEvent(previousTile, CurrentTile);
  71. }
  72. }
  73. internal void OnTileExited(Tile tile)
  74. {
  75. if (!overlappingTiles.Contains(tile))
  76. return;
  77. var previousTile = CurrentTile;
  78. overlappingTiles.Remove(tile);
  79. if (CurrentTile != previousTile)
  80. {
  81. OnTileChanged?.Invoke(this, previousTile, CurrentTile);
  82. OnTileChangedEvent(previousTile, CurrentTile);
  83. }
  84. }
  85. }
  86. }