WeatherEnclosureDetector.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace Funly.SkyStudio
  6. {
  7. // Detect collisions with enclosures to change the weather enclosure as player moves around.
  8. public class WeatherEnclosureDetector : MonoBehaviour
  9. {
  10. [Tooltip("Default enclosure used when not inside the trigger of another enclosure area.")]
  11. public WeatherEnclosure mainEnclosure;
  12. List<WeatherEnclosure> triggeredEnclosures = new List<WeatherEnclosure>();
  13. public RainDownfallController rainController;
  14. // Callback for when the weather enclosure changes.
  15. public Action<WeatherEnclosure> enclosureChangedCallback;
  16. private void Start()
  17. {
  18. ApplyEnclosure();
  19. }
  20. private void OnEnable()
  21. {
  22. ApplyEnclosure();
  23. }
  24. private void OnTriggerEnter(Collider other)
  25. {
  26. WeatherEnclosure enclosure = other.gameObject.GetComponentInChildren<WeatherEnclosure>();
  27. if (!enclosure) {
  28. return;
  29. }
  30. if (triggeredEnclosures.Contains(enclosure)) {
  31. triggeredEnclosures.Remove(enclosure);
  32. }
  33. triggeredEnclosures.Add(enclosure);
  34. ApplyEnclosure();
  35. }
  36. private void OnTriggerExit(Collider other)
  37. {
  38. WeatherEnclosure enclosure = other.gameObject.GetComponentInChildren<WeatherEnclosure>();
  39. if (!enclosure) {
  40. return;
  41. }
  42. if (!triggeredEnclosures.Contains(enclosure)) {
  43. return;
  44. }
  45. triggeredEnclosures.Remove(enclosure);
  46. ApplyEnclosure();
  47. }
  48. public void ApplyEnclosure()
  49. {
  50. WeatherEnclosure enclosure;
  51. if (triggeredEnclosures.Count > 0) {
  52. enclosure = triggeredEnclosures[triggeredEnclosures.Count - 1];
  53. if (!enclosure) {
  54. Debug.LogError("Failed to find mesh renderer on weather enclosure, using main enclosure instead.");
  55. enclosure = mainEnclosure;
  56. }
  57. } else {
  58. enclosure = mainEnclosure;
  59. }
  60. if (enclosureChangedCallback != null) {
  61. enclosureChangedCallback(enclosure);
  62. }
  63. }
  64. }
  65. }