AutoDoor.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using UnityEngine;
  2. namespace DunGen.Demo
  3. {
  4. public class AutoDoor : MonoBehaviour
  5. {
  6. public enum DoorState
  7. {
  8. Open,
  9. Closed,
  10. Opening,
  11. Closing,
  12. }
  13. public GameObject Door;
  14. public Vector3 OpenOffset = new Vector3(0, 2.5f, 0);
  15. public float Speed = 3.0f;
  16. private Vector3 closedPosition;
  17. private DoorState currentState = DoorState.Closed;
  18. private float currentFramePosition = 0.0f;
  19. private Door doorComponent;
  20. private void Start()
  21. {
  22. doorComponent = GetComponent<Door>();
  23. closedPosition = Door.transform.localPosition;
  24. }
  25. private void Update()
  26. {
  27. if (currentState == DoorState.Opening || currentState == DoorState.Closing)
  28. {
  29. Vector3 openPosition = closedPosition + OpenOffset;
  30. float frameOffset = Speed * Time.deltaTime;
  31. if (currentState == DoorState.Closing)
  32. frameOffset *= -1;
  33. currentFramePosition += frameOffset;
  34. currentFramePosition = Mathf.Clamp(currentFramePosition, 0, 1);
  35. Door.transform.localPosition = Vector3.Lerp(closedPosition, openPosition, currentFramePosition);
  36. // Finished
  37. if (currentFramePosition == 1.0f)
  38. currentState = DoorState.Open;
  39. else if (currentFramePosition == 0.0f)
  40. {
  41. currentState = DoorState.Closed;
  42. doorComponent.IsOpen = false;
  43. }
  44. }
  45. }
  46. private void OnTriggerEnter(Collider other)
  47. {
  48. PlayerController playerController = other.GetComponent<PlayerController>();
  49. // Ignore overlaps with anything other than the player
  50. if (playerController == null)
  51. return;
  52. currentState = DoorState.Opening;
  53. doorComponent.IsOpen = true;
  54. }
  55. private void OnTriggerExit(Collider other)
  56. {
  57. PlayerController playerController = other.GetComponent<PlayerController>();
  58. // Ignore overlaps with anything other than the player
  59. if (playerController == null)
  60. return;
  61. currentState = DoorState.Closing;
  62. }
  63. }
  64. }