Door.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. namespace ZenFulcrum.EmbeddedBrowser {
  5. public class Door : MonoBehaviour {
  6. public Vector3 openOffset = new Vector3(0, -6.1f, 0);
  7. [Tooltip("Time to open or close, in seconds.")]
  8. public float openSpeed = 2;
  9. [Tooltip("Number of coins needed to open the door.")]
  10. public int numCoins = 0;
  11. private Vector3 closedPos, openPos;
  12. public enum OpenState {
  13. Open, Closed, Opening, Closing
  14. }
  15. public event Action<OpenState> stateChange = state => {};
  16. private OpenState _state;
  17. public OpenState State {
  18. get { return _state; }
  19. set {
  20. _state = value;
  21. stateChange(_state);
  22. }
  23. }
  24. public void Start() {
  25. closedPos = transform.position;
  26. openPos = transform.position + openOffset;
  27. State = OpenState.Closed;
  28. var browser = GetComponentInChildren<Browser>();
  29. //Tell the interface how many coins we need
  30. browser.CallFunction("setRequiredCoins", numCoins);
  31. browser.RegisterFunction("toggleDoor", args => {
  32. switch ((string)args[0].Check()) {
  33. case "open": Open(); break;
  34. case "close": Close(); break;
  35. case "toggle": Toggle(); break;
  36. }
  37. });
  38. //Update interface when we get a coin
  39. PlayerInventory.Instance.coinCollected += coinCount => {
  40. browser.CallFunction("setCoinCoint", coinCount);
  41. };
  42. }
  43. /** Toggles open state. */
  44. public void Toggle() {
  45. if (State == OpenState.Open || State == OpenState.Opening) Close();
  46. else Open();
  47. }
  48. public void Open() {
  49. if (State == OpenState.Open) return;
  50. State = OpenState.Opening;
  51. }
  52. public void Close() {
  53. if (State == OpenState.Closed) return;
  54. State = OpenState.Closing;
  55. }
  56. public void Update() {
  57. if (State == OpenState.Opening) {
  58. var percent = Vector3.Distance(transform.position, closedPos) / openOffset.magnitude;
  59. percent = Mathf.Min(1, percent + Time.deltaTime / openSpeed);
  60. transform.position = Vector3.Lerp(closedPos, openPos, percent);
  61. if (percent >= 1) State = OpenState.Open;
  62. } else if (State == OpenState.Closing) {
  63. var percent = Vector3.Distance(transform.position, openPos) / openOffset.magnitude;
  64. percent = Mathf.Min(1, percent + Time.deltaTime / openSpeed);
  65. transform.position = Vector3.Lerp(openPos, closedPos, percent);
  66. if (percent >= 1) State = OpenState.Closed;
  67. }
  68. }
  69. }
  70. }